Anil,

Yes, you're right that atomic cache doesn't support explicit locks.

>I am not sure how entryprocessor invoke behaves in my case. if it is
single cache update, that is straight forward. and not sure about
transaction for 2-3 operations for 2 caches.
EntryProcessor modifies (update/remove/create) only one entry.

>I do 2 to 3 updates/puts between two caches like updating parent person
info to child person and creating empty detail info by checking detail
cache.
Ignite supports cross-cache transactions (one transaction can update to
several caches) with support ACID . I think that this feature will be
helpful for your.

On Thu, Mar 16, 2017 at 8:20 PM, Anil <[email protected]> wrote:

> Hi Nikolai,
>
> Thanks for response.
>
> Distributed locks wont work for atomic caches. correct ? if i remember it
> correclty, i see an exception sometime back and then i used transcational.
>
> I do 2 to 3 updates/puts between two caches like updating parent person
> info to child person and creating empty detail info by checking detail
> cache.
>
> I am not sure how entryprocessor invoke behaves in my case. if it is
> single cache update, that is straight forward. and not sure about
> transaction for 2-3 operations for 2 caches.
>
> Thanks.
>
> On 16 March 2017 at 22:43, Nikolai Tikhonov <[email protected]> wrote:
>
>> If your update logic does not contains heavy operations (locks, cache
>> puts and etc) and how I see from your comment above this is true you can
>> use IgniteCache#invoke [1]. The method provides needed you garanty. Also
>> you can change cache mode to ATOMIC for better perfomance.
>>
>> 1. https://apacheignite.readme.io/docs/jcache#section-entryprocessor
>>
>> On Thu, Mar 16, 2017 at 7:55 PM, Anil <[email protected]> wrote:
>>
>>> Hi Nikolai,
>>>
>>> No. person message and detail message can be executed by different nodes
>>> and both messages executes different logics.
>>>
>>> *Person message* - will update/create person entry into person cache
>>> and check the if any detail entry is available or not in detail cache. if
>>> exists, updates person info to detail entry. if not, creates empty detail
>>> entry
>>> *Detail Message* - will check empty detail entry is availble or not. if
>>> yes, delete and create new detail entry with personal info. else
>>> creates/updates the entry.
>>>
>>> To avoid data inconsistency, i created lock on person id so messages
>>> (person and detail) of person id wont run in parallel.
>>>
>>> now, i am trying to achieve atomicity for each message operations. Hope
>>> this is clear.
>>>
>>> Thanks,
>>>
>>> On 16 March 2017 at 22:12, Nikolai Tikhonov <[email protected]>
>>> wrote:
>>>
>>>> Hi Anil!
>>>>
>>>> If I understood correctly (you need to perform operations on two caches
>>>> have exclusive lock on personId) then in your case the better way is using
>>>> Ignite pessimistic transaction:
>>>>
>>>> personCache = ignite.cache("PERSON_CACHE");
>>>> detailCache = ignite.cache("DETAIL_CACHE");
>>>>
>>>> try (Transaction tx = ignite.transactions().txStart(PESSIMISTIC,
>>>> REPEATABLE_READ)) {
>>>>     // On this step will be acquired lock on personId
>>>>     // and only one thread in grid will execute code bellow.
>>>>     personCache.get(personId);
>>>>
>>>>     // cache put,remove,invoke and etc.
>>>>     tx.commit();
>>>> }
>>>>
>>>> Is't work for you?
>>>>
>>>> On Thu, Mar 16, 2017 at 3:09 PM, Anil <[email protected]> wrote:
>>>>
>>>>> Hi,
>>>>>
>>>>> I need to make sure that entries are added correctly in two caches.
>>>>>
>>>>> I have two caches  Person and Detail. personId is the key for Person
>>>>> cache and detailedId is the key for Detail cache.
>>>>>
>>>>> Each Detail cache entry would have some information of Person cache
>>>>> entry based on personId. and i am adding entries to caches using Kafka.
>>>>>
>>>>> When Person and Detail messages are processed, order cannot be
>>>>> maintained and processed by different nodes. So to avoid data 
>>>>> inconsistency
>>>>> issues - i did following.
>>>>>
>>>>> *Person message :*
>>>>>
>>>>> Locl lock = personCache.lock(personId);
>>>>> lock.lock();
>>>>>
>>>>> // update person operations for both person cache and detail cache
>>>>>
>>>>> lock.unlock();
>>>>>
>>>>> *Detail Mesage :*
>>>>>
>>>>>
>>>>> Locl lock = detailCache.lock(personId);  // person id from detail
>>>>> message
>>>>> lock.lock();
>>>>>
>>>>> // update person operations for both person cache and detail cache
>>>>>
>>>>> lock.unlock();
>>>>>
>>>>> with this, till one of the message processed for same person Id, other
>>>>> would not acquire lock.
>>>>>
>>>>> now how to maintain the ACID for update operations ? ignite
>>>>> transactions does not work inside lock. Is there anyway to achieve the
>>>>> above usecase with ACID ?
>>>>>
>>>>> Thanks
>>>>>
>>>>>
>>>>
>>>
>>
>

Reply via email to