乐观锁和悲观锁
乐观锁是一种思想,具体实现是表中有一个版本字段,第一次读的时候获取到这个字段。处理完业务逻辑开始更新的时候,需要再次查看该字段的值是否和第一次一样。如果一样更新,反之不更新。为什么叫乐观,原因是这个模式没有从数据库加锁,等到更新的时候再判断是否可以更新。
悲观锁是数据库成名加锁,都会阻塞去等待锁。
悲观锁:
使用悲观锁很简单,直接手动加锁就行了。例如select * from XX for update。在select语句后面加了for update相当于加了排他锁(写锁),加了写锁后,其他的事务就不能对它修改了。需要等待当前事务修改完以后才可以修改。同一条记录,如果一个用户A使用select …… for update,B用户就不能对该条数据进行修改,必须A用户完成当前事务,B才可以对该条记录操作。
乐观锁:
不是数据层面上的锁,是需要自己手动去加的锁。一般添加一个版本实现。具体过程:
A用户select * from table会查询出记录,同时也会有一个version字段,B用户select * from table也会查询出记录,也有一个version字段。B用户对这条记录进行修改:update a set name=”yy”,version = version+1 where ID=#{id} and version =#{version},判断之前查询到的version与现在的数据的version比较,同时会更新version字段。然后数据库的记录进行了修改,1 yy 2。B用户也对这条记录做同样修改,但是失败了,因为当前数据库中的版本和查询出来的不一致。
欢迎批评指正,提出问题,谢谢!