乐观锁
乐观锁采取了更加宽松的加锁机制。乐观锁是相对悲观锁而言,也是为了避免数据库幻读、业务处理时间过长等原因引起数据处理错误的一种机制,但乐观锁不会刻意使用数据库本身的锁机制,而是依据数据本身来保证数据的正确性。
--乐观锁:就是很乐观,每次去拿数据的时候都认为别人不会修改。
--更新时先查询出num,如果num变化了,更新不会成功。
1、 select num as num_1 from user where id =1;
2、update user set name='zhangsan',num=(num+1) where id=1 and num=num_1;
p.s.关键在于先查询,再加条件
悲观锁
悲观锁,正如其名,具有强烈的独占和排他特性。它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度。因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。
--悲观锁:假设每一次拿数据,都有认为会被修改,所以给数据库的行或表上锁。
--要注意for update要用在索引上,不然会锁表。
1、START TRANSACTION; # 开启事务
2、select * from USER where id=1 for update;
3、UPDATE USER SET name= 'zhangsan' WHERE id = 1;
4、COMMIT; # 提交事务
p.s.关键在于 for update数据库锁