cancel
Showing results for 
Search instead for 
Did you mean: 

ActivitiOptimisticLockException and multiple async executors

tomekzaremba
Champ in-the-making
Champ in-the-making
Hi,

why ActivitiOptimisticLockException is thrown after serviceTask is completed, not before its execution? During stress tests I can see, that executor which get AOLE done given serviceTask and after that exception is thrown, so task will be executed again?

Why lock is not checked before serviceTask execution? And another question - how I can handle such case to avoid such situations?
2 REPLIES 2

tomekzaremba
Champ in-the-making
Champ in-the-making
Additionally I enabled DEBUG level and I see such logs:

<code>
dev-8097Smiley Very HappyEBUG [2016-02-22 14:15:59.905] [,org.activiti.engine.impl.db.DbSqlSession,provideTaskExecutor-1,,,,]   insert JobEntity [id=6a5d299d-d966-11e5-80df-ac87a327df39]
dev-8097Smiley Very HappyEBUG [2016-02-22 14:15:59.905] [,org.activiti.engine.impl.db.DbSqlSession,provideTaskExecutor-1,,,,] inserting: JobEntity [id=6a5d299d-d966-11e5-80df-ac87a327df39]
dev-8097Smiley Very HappyEBUG [2016-02-22 14:15:59.905] [,o.a.e.i.p.entity.JobEntity.insertMessage,provideTaskExecutor-1,,,,] ==> Parameters: 6a5d299d-d966-11e5-80df-ac87a327df39(String), null, null, true(Boolean), cafab7c5-d95e-11e5-890a-ac87a327df39(String), 5cca19f3-d95e-11e5-890a-ac87a327df39(String), exchange-processing:18:a4737b75-d92f-11e5-b0f5-ac87a327df39(String), 2016-02-22 14:20:59.905(Timestamp), 3(Integer), null, null, async-continuation(String), null, (String)
dev-8097Smiley Very HappyEBUG [2016-02-22 14:21:45.417] [,o.a.engine.impl.cmd.LockExclusiveJobCmd ,provideTaskExecutor-1,,,,] Executing lock exclusive job 6a5d299d-d966-11e5-80df-ac87a327df39 cafab7c5-d95e-11e5-890a-ac87a327df39
dev-8097Smiley Very HappyEBUG [2016-02-22 14:21:45.418] [,o.a.engine.impl.cmd.ExecuteAsyncJobCmd  ,provideTaskExecutor-1,,,,] Executing async job 6a5d299d-d966-11e5-80df-ac87a327df39
dev-8097Smiley Very HappyEBUG [2016-02-22 14:21:50.884] [B099000688,org.activiti.engine.impl.db.DbSqlSession,provideTaskExecutor-1,,,729480,1000764210]   delete JobEntity [id=6a5d299d-d966-11e5-80df-ac87a327df39]
dev-8097Smiley Very HappyEBUG [2016-02-22 14:21:50.887] [B099000688,org.activiti.engine.impl.db.DbSqlSession,provideTaskExecutor-1,,,729480,1000764210] executing: delete JobEntity [id=6a5d299d-d966-11e5-80df-ac87a327df39]
dev-8097Smiley Very HappyEBUG [2016-02-22 14:21:50.887] [B099000688,o.a.e.i.p.entity.JobEntity.deleteMessage,provideTaskExecutor-1,,,729480,1000764210] ==> Parameters: 6a5d299d-d966-11e5-80df-ac87a327df39(String), 1(Integer)
dev-8097Smiley Very HappyEBUG [2016-02-22 14:21:50.887] [B099000688,o.a.e.impl.interceptor.CommandContext   ,provideTaskExecutor-1,,,729480,1000764210] Optimistic locking exception : org.activiti.engine.ActivitiOptimisticLockingException: JobEntity [id=6a5d299d-d966-11e5-80df-ac87a327df39] was updated by another transaction concurrently
dev-8097Smiley Very HappyEBUG [2016-02-22 14:21:50.888] [B099000688,o.a.e.i.p.entity.JobEntity.selectJob    ,provideTaskExecutor-1,,,729480,1000764210] ==> Parameters: 6a5d299d-d966-11e5-80df-ac87a327df39(String)
dev-8097Smiley Very HappyEBUG [2016-02-22 14:21:50.889] [B099000688,org.activiti.engine.impl.db.DbSqlSession,provideTaskExecutor-1,,,729480,1000764210]   update JobEntity [id=6a5d299d-d966-11e5-80df-ac87a327df39]
dev-8097Smiley Very HappyEBUG [2016-02-22 14:21:50.889] [B099000688,org.activiti.engine.impl.db.DbSqlSession,provideTaskExecutor-1,,,729480,1000764210] updating: JobEntity [id=6a5d299d-d966-11e5-80df-ac87a327df39]
dev-8097Smiley Very HappyEBUG [2016-02-22 14:21:50.889] [B099000688,o.a.e.i.p.entity.JobEntity.updateMessage,provideTaskExecutor-1,,,729480,1000764210] ==> Parameters: 3(Integer), null, null, 2(Integer), 3b911190-d967-11e5-80df-ac87a327df39(String), JobEntity [id=6a5d299d-d966-11e5-80df-ac87a327df39] was updated by another transaction concurrently(String), 2016-02-22 14:26:50.889(Timestamp), 6a5d299d-d966-11e5-80df-ac87a327df39(String), 2(Integer)
dev-8097Smiley Very HappyEBUG [2016-02-22 14:21:50.890] [B099000688,p.p.e.ComLoggingExecuteAsyncRunnable    ,provideTaskExecutor-1,,,729480,1000764210] Optimistic locking exception during job: 6a5d299d-d966-11e5-80df-ac87a327df39 / executionId: cafab7c5-d95e-11e5-890a-ac87a327df39 / processInstance: 5cca19f3-d95e-11e5-890a-ac87a327df39
dev-8097Smiley Very HappyEBUG [2016-02-22 14:21:50.890] [B099000688,o.a.e.impl.cmd.UnlockExclusiveJobCmd    ,provideTaskExecutor-1,,,729480,1000764210] Unlocking exclusive job 6a5d299d-d966-11e5-80df-ac87a327df39
</code>

I don't see any additional updates, so why AOLE is thrown? JobEntity is executed only on one app instance as you can see from log file name.

jbarrez
Star Contributor
Star Contributor
Optimistic locking on itself is not a problem. If you have multiple executors, it is even expected, as multiple executors are battling for the same jobs. Nothing to worry about.. (see other thread where I replied too)