乐观锁
乐观锁不是数据库自带的,需要我们自己去实现。乐观锁是指操作数据库时(更新操作),想法很乐观,认为这次的操作不会导致冲突,在操作数据时,并不进行任何其他的特殊处理(也就是不加锁),而在进行更新后,再去判断是否有冲突了。
1.查询出商品信息
select (status,status,version) from t_goods where id=#{id}
2.根据商品信息生成订单
3.修改商品status为2
update t_goods
set status=2,version=version+1
where id=#{id} and version=#{version};
悲观锁:共享锁与排它锁
悲观锁就是在操作数据时,认为此操作会出现数据冲突,所以在进行每次操作时都要通过获取锁才能进行对相同数据的操作
共享锁(S锁)又称为读锁,若事务T对A加上S锁,则事务T只能读A;其他事务只能再对A加S锁,而不能加排他锁(X锁),直到T释放A上的S锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
排他锁(X锁):如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。
mysql中select * from xx where id =1 lock in share mode即可给该数据加共享锁,在该事务提交之前,不允许其他事务进行修改。
(ps:对于update,insert,delete语句会自动加排它锁)。
添加排它锁与添加共享锁类似,执行语句添加 “ for update” 即可。
行锁和表锁
正在查阅资料。