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 >>> >>> >> >
