场景:
假设一个表有两个字段(id, value ), 假设在不使用事务的情况下,同时有两个操作更新 value 字段,操作一是先查询,在内存中进行判断然后再更新,操作二在操作一查询记录之后进行了更新:update table set value = 'value3' where id= '1', 那么操作二的更新操作就会被覆盖,从而出现修改失效问题。
解决办法:
1. 这个时候,很多人会尝试对业务的接口方法使用事务(+@Transactional),事务之间有隔离性;当事务一执行的时候会锁住当前记录,防止其他事务操作当前数据,这是一种悲观锁方式,但适用于很多情况。
2. 还有一种解决方式也很常用,当你的更新操作依赖于原有的状态,可更改update 语句:update table set value = 'value2' where value = 'value1', 参考了乐观锁中的cas操作,然后再通过update受影响的行数取判断是否更新成功。 这相当于乐观锁方式,可极大地增加数据访问的并发量。