1.定义
乐观锁和悲观锁是并发控制采用的技术手段,确保当多个用户同时对数据中同一数据存取时,不会破坏事物的隔离性、统一性和数据库统一性
乐观锁
假定不会发生并发冲突,只在提交操作时检测是否违反数据完整性
实现方式:
- 记录数据版本,读数据,将版本标识读出,每更新一次标识也更新,当提交更新时,判断表中对应记录的当前版本信息与第一次的是否相同,如果相同则更新,否则认为数据过期
- 给表数据列添加一个version
特点:
(1)效率比较高,可以一直做,直到提交时才锁定,不产生锁和死锁
(2)当遇到并发事件时,会有问题
悲观锁
假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作
实现方式:
- 对更新的数据枷锁,在并发期间一旦有事物持有了数据库记录的锁,其他事物就不能再对数据更新了(需关闭数据库自动提交 set autocommit=0)
- InnnoDB中使用悲观锁
select .. for update:开启排他锁
begin;
select status from goods where id=1 for update;
insert into orders(id,goods_id) values (null,1);
update goods set status=2;
commit;
特点:
先取锁再访问,安全但效率低(加锁),有死锁的可能
锁级别:
行级锁基于索引,没有索引锁整张表