乐观锁与悲观锁

158 阅读1分钟

乐观锁

乐观锁采取了更加宽松的加锁机制。乐观锁是相对悲观锁而言,也是为了避免数据库幻读、业务处理时间过长等原因引起数据处理错误的一种机制,但乐观锁不会刻意使用数据库本身的锁机制,而是依据数据本身来保证数据的正确性。

--乐观锁:就是很乐观,每次去拿数据的时候都认为别人不会修改。
--更新时先查询出num,如果num变化了,更新不会成功。
1select num as num_1 from user where id =1;
2update user set name='zhangsan',num=(num+1) where id=1 and num=num_1;

p.s.关键在于先查询,再加条件

悲观锁

悲观锁,正如其名,具有强烈的独占和排他特性。它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度。因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。

--悲观锁:假设每一次拿数据,都有认为会被修改,所以给数据库的行或表上锁。
--要注意for update要用在索引上,不然会锁表。
1START TRANSACTION; # 开启事务
2select * from USER where id=1 for update;
3UPDATE USER  SET name= 'zhangsan' WHERE id = 1;
4COMMIT; # 提交事务
 
p.s.关键在于  for update数据库锁