乐观锁和悲观锁
2020-11-09 本文已影响0人
苍老师的眼泪
一、悲观锁
在修改数据之前先锁定,再修改的方式被称之为悲观并发控制。这是一种对数据的修改持有悲观态度的并发控制方式。
二、乐观锁
乐观锁假设数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做。乐观锁适用于读操作多的场景,这样可以提高程序的吞吐量。
mysql实操(mysql 8.0.20)
select ... for update是实现悲观锁的关键语句。
由于InnoDB支持行级锁,所以:
select * from goods where id = 2 for update;
锁住id为2的那行时,另一个会话对id为1的数据进行update操作时不受影响。
不一定时'id',但必须时主键或唯一索引。
但如果锁住了全部(select * from xxx for update)时,则对该表的任意数据进行update
操作都将会进入阻塞状态。
悲观锁案例1:
(事务隔离级别为mysql8默认的可重复读)
1号会话
set autocommit = 0;
begin;
select * from goods for update;
2号会话
update goods set amount = 20 where id = 1;
//阻塞中。。。(如果阻塞时间超过配置值则会失败,这里假设不会到底该值)
1号会话
commit
//2号会话从阻塞状态继续执行,执行成功后数据将会被修改。
悲观锁案例2:
(事务隔离级别为mysql8默认的可重复读)
1号会话
set autocommit = 0;
begin;
select * from goods for update;
update goods set amount = 19 where id = 1;
2号会话
update goods set amount = 21 where id = 1;
//阻塞中。。。(如果阻塞时间超过配置值则会失败,这里假设不会到底该值)
1号会话
commit
//2号会话从阻塞状态继续执行,执行成功后数据将是2号会话更新的数据。