一次数据库的修改数据的过程包括:读取,修改,写入。
悲观锁,认为在整个过程中都会面临数据被其他session修改的可能性,所以为了保证修改过程能顺利进行,使用排它锁保证在当前session修改数据时,不允许其他session修改相同行的数据。
乐观锁,认为在读取和修改的时候不会有session修改同行数据,所以它只在写入的时候进行一下检查版本号。如果版本号没有变,也就是说读取数据和写入新数据时版本号比对相同,那么则将数据写入。否则,返回操作失败信息,由用户决定如何处理。
悲观锁的使用事例:
Select...for update事例:
set autocommit =0;//关闭自动提交
begin;//开始事务
select * from order where id=989879 for update;//查询信息
update order set name='names';//修改信息
commit;//提交事务
执行select…for update时,一般的SELECT查询则不受影响。
乐观锁的使用事例:
例如有表Teacher,字段:
| id | name | version |
| 23| coco | 4 |
当事务一进行更新操作:update teacher set name='nason' where id = #{id} and version = #{version};
此时操作完后数据会变为id = 23,name = nason,version = 5,当另外一个事务二同样执行更新操作的时候,却发现version != 4,此时事务二就会操作失败,从而保证了数据的正确性。