【问题】
1.在流程引擎调用什么接口时才执行SELECT processInstID FROM WFPROCESSINST WHERE processInstID=:1 for update 这样的行锁sql?
解答:调用比如完成工作项、终止活动实例,终止流程等api会执行加行级排他锁。
2.为什么会执行流程实例的行锁(SELECT processInstID FROM WFPROCESSINST WHERE processInstID=:1 for update)?
解答:设计的初衷是因为多进程、多线程,会对同一个的流程实例不同工作项、活动进行操作,而操作会先进行内存状态修改,最后才进行持久化,如果不对会对流程实例加锁,会导致流程实例缓存的状态在各个进程、或各个线程出现不一致现象,而导致流程状态在不同的线程或进程不一致的状态,所以需要对流程实例加锁,由于是数据库锁,属于分布式锁,从而保证单个流程数据不被多个节点所修改,锁的主要目的是为了保证数据的一致性,这个锁锁的是单条数据,对多个流程及流程实例之间是没有影响。
3.在执行这类有for update行锁的接口时,如果接口执行有异常,是否会释放数据库连接?(需代码截图)
解答:由于在修改流程数据时会加锁,这个锁是事务锁,若出现异常就会有事务回滚,相关锁和流程也会被释放。用户看到其中一个现象就是看到for update不释放,这个要再分析,这个如果在oracle锁看到的sql,是上一条执行的sql,要确定这个锁执行了多长时间?是一直在,还是只有一段时间在?但是对客户端的数据库只要配置正常,数据库连接是会释放的。
详细代码截图说明参考附件:bps引擎什么情况会执行for update 总结.docx