ignite-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Andrey Mashenkov <andrey.mashen...@gmail.com>
Subject Re: Updating the same entry multiple time in Ignite transaction
Date Tue, 05 Jun 2018 14:03:25 GMT
Hi,

Do you mean you put entry in one thread and delete in another?
If so, it is ok.

Seems, you have scenario like this one:
1. Put-thread remembers entry version at first read and applies update
operation only when commit() method has been called.
2. Delete-thread starts separate implicit optimistic transaction that
removes entry in-between and change entry version.

Actually, Put-thread will not lock an entry on read, but on commit. This is
how Optimistic transaction works.
Seems, the Exception you saw is caused by concurrent transactional
operation that occurred right before Put-tx commit, but after Put-tx read
the entry.


On Tue, Jun 5, 2018 at 4:41 PM, Prasad Bhalerao <
prasadbhalerao1983@gmail.com> wrote:

> Hi,
>
> I observed one more behavior. I am using executor service to execute the
> tasks.
> When I submit a task to remove entries from cache, I get transaction
> optimistic exception.
> But instead of submitting the task, if I just call task.run() method it
> works fine.
>
>
> Thanks,
> Prasad
>
> On Tue, Jun 5, 2018 at 7:07 PM, Andrey Mashenkov <
> andrey.mashenkov@gmail.com> wrote:
>
>> Hi,
>>
>> We'll check this case.
>> Please, share a reproducer if possible.
>>
>> On Tue, Jun 5, 2018 at 3:53 PM, Prasad Bhalerao <
>> prasadbhalerao1983@gmail.com> wrote:
>>
>>> Hi,
>>>
>>> In my case only one transaction is in progress. In this transaction I
>>> update few entries in cache and then re-read these entries and updates it
>>> again in some other method.
>>> When I read the entry after first update operations, transaction entry
>>> read version(IgniteTxEntry-entryReadVersion) changes. This version is
>>> validated in GridDhtTxPrepareFuture::checkReadConflict method.
>>>
>>> But I don't understand why transaction fails if the entry is modified
>>> after read operation in same transaction?
>>>
>>> Thanks,
>>> Prasad
>>>
>>> On Tue, Jun 5, 2018 at 6:07 PM, Andrey Mashenkov <
>>> andrey.mashenkov@gmail.com> wrote:
>>>
>>>> Hi,
>>>>
>>>> It is ok, Optimistic transaction failed on commit
>>>> with TransactionOptimisticException due to write\read conflict.
>>>> See javadoc [1] and documentation [2] for details.
>>>>
>>>> Javadoc says:
>>>> *  However, in {@link TransactionConcurrency#OPTIMISTIC} mode, if some
>>>> transactions cannot be serially isolated
>>>>  *  from each other, then one winner will be picked and the other
>>>> transactions in conflict will result in
>>>>  * {@link TransactionOptimisticException} being thrown.
>>>>
>>>> [1] https://github.com/apache/ignite/blob/master/modules/cor
>>>> e/src/main/java/org/apache/ignite/transactions/Transaction.java
>>>> [2] https://apacheignite.readme.io/docs/transactions#section
>>>> -optimistic-transactions
>>>>
>>>> On Tue, Jun 5, 2018 at 3:19 PM, Prasad Bhalerao <
>>>> prasadbhalerao1983@gmail.com> wrote:
>>>>
>>>>> Hi,
>>>>> I tried this with simple code and it works fine.
>>>>> But in my application when I do similar thing I get following
>>>>> exception when I do commit. I am getting transaction as follows.
>>>>>
>>>>>     IgniteTransactions igniteTx = getServiceContext().getGridSer
>>>>> vice().getTransaction();
>>>>>     try (Transaction transaction = igniteTx
>>>>>         .txStart(TransactionConcurrency.OPTIMISTIC,
>>>>> TransactionIsolation.SERIALIZABLE)) {
>>>>>
>>>>> Can you please advise?
>>>>>
>>>>> Caused by: org.apache.ignite.transactions
>>>>> .TransactionOptimisticException: Failed to prepare transaction,
>>>>> read/write conflict [key=DefaultDataAffinityKey{id=1556524,
>>>>> affinityId=1}, keyCls=com.qls.agms.grid.data.key.DefaultDataAffinityKey,
>>>>> val=null, cache=IPV4_ASSET_GROUP_DETAIL_CACHE, thread=IgniteThread
>>>>> [compositeRwLockIdx=7, stripe=-1, plc=0, name=pub-#53%springDataNode%]]
>>>>>             at org.apache.ignite.internal.uti
>>>>> l.IgniteUtils$14.apply(IgniteUtils.java:895)
>>>>>             at org.apache.ignite.internal.uti
>>>>> l.IgniteUtils$14.apply(IgniteUtils.java:893)
>>>>>             at org.apache.ignite.internal.uti
>>>>> l.IgniteUtils.convertException(IgniteUtils.java:975)
>>>>>             at org.apache.ignite.internal.pro
>>>>> cessors.cache.transactions.TransactionProxyImpl.commit(Trans
>>>>> actionProxyImpl.java:296)
>>>>>             at com.qls.agms.task.ignite.EditA
>>>>> ssetGroupIgniteTask.run(EditAssetGroupIgniteTask.java:44)
>>>>>             at org.apache.ignite.internal.pro
>>>>> cessors.closure.GridClosureProcessor$C4.execute(GridClosureP
>>>>> rocessor.java:1944)
>>>>>             at org.apache.ignite.internal.pro
>>>>> cessors.job.GridJobWorker$2.call(GridJobWorker.java:566)
>>>>>             at org.apache.ignite.internal.uti
>>>>> l.IgniteUtils.wrapThreadLoader(IgniteUtils.java:6623)
>>>>>             at org.apache.ignite.internal.pro
>>>>> cessors.job.GridJobWorker.execute0(GridJobWorker.java:560)
>>>>>             ... 5 common frames omitted
>>>>> Caused by: org.apache.ignite.internal.tra
>>>>> nsactions.IgniteTxOptimisticCheckedException: Failed to prepare
>>>>> transaction, read/write conflict [key=DefaultDataAffinityKey{id=1556524,
>>>>> affinityId=1}, keyCls=com.qls.agms.grid.data.key.DefaultDataAffinityKey,
>>>>> val=null, cache=IPV4_ASSET_GROUP_DETAIL_CACHE, thread=IgniteThread
>>>>> [compositeRwLockIdx=7, stripe=-1, plc=0, name=pub-#53%springDataNode%]]
>>>>>             at org.apache.ignite.internal.pro
>>>>> cessors.cache.distributed.dht.GridDhtTxPrepareFuture.version
>>>>> CheckError(GridDhtTxPrepareFuture.java:1190)
>>>>>             at org.apache.ignite.internal.pro
>>>>> cessors.cache.distributed.dht.GridDhtTxPrepareFuture.checkRe
>>>>> adConflict(GridDhtTxPrepareFuture.java:1138)
>>>>>             at org.apache.ignite.internal.pro
>>>>> cessors.cache.distributed.dht.GridDhtTxPrepareFuture.prepare
>>>>> 0(GridDhtTxPrepareFuture.java:1205)
>>>>>             at org.apache.ignite.internal.pro
>>>>> cessors.cache.distributed.dht.GridDhtTxPrepareFuture.mapIfLo
>>>>> cked(GridDhtTxPrepareFuture.java:671)
>>>>>             at org.apache.ignite.internal.pro
>>>>> cessors.cache.distributed.dht.GridDhtTxPrepareFuture.prepare
>>>>> (GridDhtTxPrepareFuture.java:1048)
>>>>>             at org.apache.ignite.internal.pro
>>>>> cessors.cache.distributed.near.GridNearTxLocal.prepareAsyncL
>>>>> ocal(GridNearTxLocal.java:3452)
>>>>>             at org.apache.ignite.internal.pro
>>>>> cessors.cache.transactions.IgniteTxHandler.prepareColocatedT
>>>>> x(IgniteTxHandler.java:257)
>>>>>             at org.apache.ignite.internal.pro
>>>>> cessors.cache.distributed.near.GridNearOptimisticSerializabl
>>>>> eTxPrepareFuture.prepareLocal(GridNearOptimisticSerializable
>>>>> TxPrepareFuture.java:580)
>>>>>             at org.apache.ignite.internal.pro
>>>>> cessors.cache.distributed.near.GridNearOptimisticSerializabl
>>>>> eTxPrepareFuture.prepare(GridNearOptimisticSerializableTxPre
>>>>> pareFuture.java:494)
>>>>>             at org.apache.ignite.internal.pro
>>>>> cessors.cache.distributed.near.GridNearOptimisticSerializabl
>>>>> eTxPrepareFuture.prepare(GridNearOptimisticSerializableTxPre
>>>>> pareFuture.java:408)
>>>>>             at org.apache.ignite.internal.pro
>>>>> cessors.cache.distributed.near.GridNearOptimisticSerializabl
>>>>> eTxPrepareFuture.prepare0(GridNearOptimisticSerializableTxPr
>>>>> epareFuture.java:315)
>>>>>             at org.apache.ignite.internal.pro
>>>>> cessors.cache.distributed.near.GridNearOptimisticTxPrepareFu
>>>>> tureAdapter.prepareOnTopology(GridNearOptimisticTxPrepareFut
>>>>> ureAdapter.java:137)
>>>>>             at org.apache.ignite.internal.pro
>>>>> cessors.cache.distributed.near.GridNearOptimisticTxPrepareFu
>>>>> tureAdapter.prepare(GridNearOptimisticTxPrepareFutureAdapter.java:74)
>>>>>             at org.apache.ignite.internal.pro
>>>>> cessors.cache.distributed.near.GridNearTxLocal.prepareNearTx
>>>>> Local(GridNearTxLocal.java:3161)
>>>>>             at org.apache.ignite.internal.pro
>>>>> cessors.cache.distributed.near.GridNearTxLocal.commitNearTxL
>>>>> ocalAsync(GridNearTxLocal.java:3221)
>>>>>             at org.apache.ignite.internal.pro
>>>>> cessors.cache.GridCacheAdapter.commitTxAsync(GridCacheAdapte
>>>>> r.java:4019)
>>>>>             at org.apache.ignite.internal.pro
>>>>> cessors.cache.GridCacheSharedContext.commitTxAsync(GridCache
>>>>> SharedContext.java:975)
>>>>>             at org.apache.ignite.internal.pro
>>>>> cessors.cache.transactions.TransactionProxyImpl.commit(Trans
>>>>> actionProxyImpl.java:288)
>>>>>             ... 10 common frames omitted
>>>>>
>>>>> Thanks,
>>>>> Prasad
>>>>>
>>>>> On Tue, Jun 5, 2018 at 2:18 PM, Andrey Mashenkov <
>>>>> andrey.mashenkov@gmail.com> wrote:
>>>>>
>>>>>> Hi,
>>>>>>
>>>>>> Sure, multiple actions with same query within same transaction should
>>>>>> work.
>>>>>>
>>>>>> Please, let us know if you observe unexpected behavior.
>>>>>> Any reproducer will be appreciated.
>>>>>>
>>>>>>
>>>>>> On Tue, Jun 5, 2018 at 10:36 AM, Prasad Bhalerao <
>>>>>> prasadbhalerao1983@gmail.com> wrote:
>>>>>>
>>>>>>> Hi,
>>>>>>>
>>>>>>> Can I update the same entry multiple time inside ignite transaction?
>>>>>>> Or
>>>>>>> Can I update an entry and then remove the same entry in ignite
>>>>>>> transaction?
>>>>>>>
>>>>>>> Thanks,
>>>>>>> Prasad
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Best regards,
>>>>>> Andrey V. Mashenkov
>>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> Best regards,
>>>> Andrey V. Mashenkov
>>>>
>>>
>>>
>>
>>
>> --
>> Best regards,
>> Andrey V. Mashenkov
>>
>
>


-- 
Best regards,
Andrey V. Mashenkov

Mime
View raw message