ignite-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Nikolai Tikhonov <ntikho...@apache.org>
Subject Re: Lock and Transaction
Date Thu, 16 Mar 2017 17:13:24 GMT
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 <anilklce@gmail.com> 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 <ntikhonov@apache.org> 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 <anilklce@gmail.com> 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
>>>
>>>
>>
>

Mime
View raw message