乐观锁和悲观锁
程序员文章站
2022-06-02 11:15:56
...
1.乐观锁和悲观锁的概念
乐观锁:假设不会发生并发冲突,数据库的并发操作只在提交的时候检查数据的完整性,并发效率高,但是a提交的时候b恰好读取了该数据,那么数据就不一致了,b提交的时候发现数据不一致,需要重新读取,增加了并发读取数据的次数。
悲观锁:假设会发生并发冲突,屏蔽一切违法完整性的操作。在开始改变对象的时候就锁住,其他任何线程都无法修改,直到提交完成后才允许修改该对象了。这样加锁的时间会比较长,并发性较差。
2.数据库中悲观锁的流程
首先当用户操作某个记录的时候,会先给记录加上排它锁,如果枷锁失败,说明有用户正在操作该记录,那么需要等待或者抛出异常。如果加锁成功了,那么等待事务提交后,就会解锁。期间其他用户需要等待或者抛出异常。
2.1mysql的悲观锁的应用
- 先关闭自动提交属性:set autocommit = 0;
- 开启排它锁:
START TRANSACTION ;SELECT * from customer FOR UPDATE ;
update customer set name='c12389' where id=1;
COMMIT ;
当Commit后数据才会被更新。
3.乐观锁一般使用"记录数据版本"来实现:使用版本号时,可以在数据初始化时指定一个版本号,每次对数据的更新操作都对版本号执行+1操作。并判断当前版本号是不是该数据的最新的版本号.
update t_goods
set status=2,version=version+1
where id=#{id} and version=#{version};
上一篇: mac phpize 问题