原标题:Java 乐观锁原理与实战演练
一、 前言
最近在做一个简单审批流程的项目,由于只有固定二级审批所以没有工作流组件,然后就遇到一个审批节点捞单时候,多个人同时审批时候如何保证业务正常运行的问题,我采用的就是乐观锁来解决的。所谓捞单就是一个审批节点可以同时由多个人同时审批。
二、 乐观锁实现方式
乐观锁意思是说多个事务修改数据库中同一条记录时候,并不是在一个事务中使用 for update 锁定这条记录从而防止其他事务在本事务提交前访问这条记录,而是在具体执行更新语句时候进行判断,并通过更新结果影响的行数来判断当前更新是否有效。具体来说有两种实现方式:
2.1 使用业务状态来实现乐观锁
比如一个任务表里面包含如下字段:
id
comment
status
1
123456
new
一个任务的status有:new,operator,manager状态。new状态下有多个A人可以去更新这条记录的comment并且把status更新为operator,但是只能有一个人能成功。operator状态下可以多个B人去更新这题记录的comment并且status更新为manager但是只有一个人能更新成功。
这时候就可以使用status这个字段的值来实现乐观锁,具体来说:
对于A类人来说更新使用: update 表 set comment='',status='operator' where status = 'new' and id = 1;
对应B类型来说更新使用: update 表 set comment='