Hi Nikolai, Thanks for response. in my usecase, i need to control incoming messages so that no two messages of personId process in parallel. i believe this can achieved with both explicit locks and entry processor.
Can entryprocessor support cross cache atomicity ? Thanks On 17 March 2017 at 01:29, Nikolai Tikhonov <[email protected]> wrote: > 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 >>>>>> >>>>>> >>>>> >>>> >>> >> >
