我们已经使用了Activiti framework 5.15版本,并且我们得到了作业执行的并发修改问题。
还提到了错误堆栈跟踪
2018-09-19 16:13:46,083 ERROR [org.activiti.engine.impl.jobexecutor.ExecuteJobsRunnable] (pool-4-thread-30) exception during job execution: ProcessInstance[34391064] was updated by another transaction concurrently: org.activiti.engine.ActivitiOptimisticLockingException: ProcessInstance[34391064] was updated by another transaction concurrently
at org.activiti.engine.impl.db.DbSqlSession.flushUpdates(DbSqlSession.java:622)
at org.activiti.engine.impl.db.DbSqlSession.flush(DbSqlSession.java:503)
at org.activiti.engine.impl.interceptor.CommandContext.flushSessions(CommandContext.java:182)
at org.activiti.engine.impl.interceptor.CommandContext.close(CommandContext.java:128)
at org.activiti.engine.impl.interceptor.CommandContextInterceptor.execute(CommandContextInterceptor.java:66)
at org.activiti.spring.SpringTransactionInterceptor$1.doInTransaction(SpringTransactionInterceptor.java:47)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:133)
at org.activiti.spring.SpringTransactionInterceptor.execute(SpringTransactionInterceptor.java:45)
at org.activiti.engine.impl.interceptor.LogInterceptor.execute(LogInterceptor.java:31)
at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:40)
at org.activiti.engine.impl.cfg.CommandExecutorImpl.execute(CommandExecutorImpl.java:35)
at org.activiti.engine.impl.jobexecutor.ExecuteJobsRunnable.run(ExecuteJobsRunnable.java:52)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
我们已将hazelcast锁定机制修复到processInstanceId中,因为它在孔工作流执行期间是唯一的。
我们已经采取Hazelcast锁时,激活开始事务(**在ExecuteJobCommand.java之前job.execute(命令上下文); **) 执行服务任务,并释放此锁时,激活提交事务(服务任务)在命令ontext.java后transactionContext.commit();
使用这种机制,我们解决了这个问题(并发修改异常)。
我需要一些建议,它会在生产中为作业执行产生任何问题?并建议如果有人有解决这个问题的另一种解决方案。
我不熟悉Activiti的内部结构,但Hazelcast分布式锁工作得很好。我认为您可能遇到的主要问题与性能有关。与任何锁定/同步的代码块一样,您正在序列化您的流程,这可能会在您扩大规模时出现问题。此外,您还需要确保始终在进程离开代码块时释放锁,尤其是在异常情况下。如果不这样做,你会陷入僵局。
在多个Activiti 5引擎运行和异步执行的情况下,这种情况很常见。这是Activiti 5作业执行器设计的一部分-如果您有多个作业执行器正在运行,那么每个作业执行器都将尝试运行作业,第一个到达作业执行器的人获胜。您可以将此视为良性异常,因为将不会提交丢失的执行中发生的情况(除非在该执行中使用html" target="_blank">自定义代码执行某些不能像http调用那样回滚的操作)。看见https://community.alfresco.com/thread/221722-activitioptimisticlockingexception-on-even-the-simplest-process避免出现这种情况的最常用方法是禁用除一个引擎外的所有引擎上的作业执行器,以便只有一个引擎在处理异步作业(实际上它是“领导者”)。
本文向大家介绍并发事务会带来哪些问题?相关面试题,主要包含被问及并发事务会带来哪些问题?时的应答技巧和注意事项,需要的朋友参考一下 在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对同一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题。 脏读(Dirty read): 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一
我假设我一路上错误地配置了什么,但我不知道是什么。 我按照以下说明在反向代理后面的KeyCloak6中设置SSL: https://www.keycloak.org/docs/latest/server_installation/index.html#设置-up-https-ssl
根据我的理解,当数据库事务跨越微服务时,我们可以通过使用message-broker(kafka、RabbitMQ等)通过发布事件来解决这个问题,这样订阅者微服务就可以通过监听这些事件来更新他们的数据库。 在异常情况下,我们可以发送故障事件,以便订阅服务器服务更新它们的状态。 我们真的需要事件来源吗?
我有这样的情况: 表一: 表二: 我需要把数量列在表2,使用“代码”作为关键字…谁能帮助我这个查询?我在用LibreOffice 预期结果
我们通常在数据库中存储对象图。在rdbms中,我们需要男性连接来重试对象之间的关系。在cassandra中,它被提升为非规范化模型以适应查询。但是这样做,我们使模型的更新更加复杂或更加指定。在Cassandra中,它存在复杂的数据类型,如set、map、list ou元组。这些类型可以通过在列表中存储连接对象的id来以简单的方式(关联、聚合、对象组合)存储对象之间的关系。唯一的缺点是必须将sql复