1、介绍
悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其余事务,以及来自外部系统的事务处理)修改持保守态度,所以,在整个数据处理过程当中,将数据处于锁定状态。悲观锁的实现,每每依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,不然,即便在本系统中实现了加锁机制,也没法保证外部系统不会修改数据)sql
2、使用介绍
咱们举一个项目中常见的应用场景吧。
好比有一张表 他有三个字段。id表明商品id ,name表明商品名字,count表明该商品数量。 咱们为了显示抢购的时候显示该商品还剩余多少件。
咱们会手动的上锁。锁住id为1的商品。好比id为1的商品名字是某型号的mac pro。count表明了该商品还剩余多少件。当并发量很大的状况下,商品数量自减的值多是不许确的。 因此当咱们在一个事务中对count字段进行修改的时候,其余的事务应该是只能读取指定id的count值。而不能写入或者update。这个时候for update的做用就是在此刻体现的。 数据库
好比说sql是这样的:
start transaction ;
select * from table_name where id =1 for update ;
update table_name set count = count - 1 where id= 1;并发
此时若是另外一个事务也想执行相似的操做:
start transaction ;
select * from table_name where id =1 for update ;
//下面的这行sql会等待,直到上面的事务回滚或者commit才获得执行。
update table_name set count = count - 1 where id= 1;spa
注意:
当选中某一个行的时候,若是是经过主键id选中的。那么这个时候是行级锁。 其余的行仍是能够直接insert 或者update的。事务
若是是经过其余的方式选中行,或者选中的条件不明确包含主键。这个时候会锁表。其余的事务对该表的任意一行记录都没法进行插入或者更新操做。只能读取。it