mysql的同享锁与排他锁详解
同享锁又称为读锁,简称S锁,望文生义,同享锁就是多个事务关于统一数据可以同享一把锁,都能拜访到数据,但是只能读不克不及修改。
排他锁又称为写锁,简称X锁,望文生义,排他锁就是不克不及与其他所共存,如一个事务猎取了一个数据行的排他锁,其他事务就不克不及再猎取该行的其他锁,包罗同享锁和排他锁,但是猎取排他锁的事务是可以对数据就行读取和修改。
关于同享锁大家大概很好懂得,就是多个事务只能读数据不克不及改数据,关于排他锁大家的懂得大概就有些差异,我起初就犯了一个错误,认为排他锁锁住一行数据后,其他事务就不克不及读取和修改该行数据,其实不是这样的。排他锁指的是一个事务在一行数据加上排他锁后,其他事务不克不及再在其上加其他的锁。mysql InnoDB引擎默许的修改数据语句,update,delete,insert都会主动给触及到的数据加上排他锁,select语句默许不会加任何锁类型,假如加排他锁可以使用select ...for update语句,加同享锁可以使用select ... lock in share mode语句。所以加过排他锁的数据行在其他事务种是不克不及修改数据的,也不克不及通过for update和lock in share mode锁的方式查询数据,但可以直接通过select ...from...查询数据,由于一般查询没有任何锁机制。
说了这么多,咱们来看下以下简便的例子:
我们有如下测试数据
此刻我们对id=1的数据行排他查询,这里会使用begin开启事务,而不会看见我关闭事务,这样做是用来测试,由于提交事务或回滚事务就会开释锁。
翻开一个查询窗口
会查询到一条数据,此刻翻开另一个查询窗口,对统一数据离别使用排他查和同享锁查询两种方式查询
排他查
同享查
我们看到开了排他锁查询和同享锁查询都会处于堵塞状态,由于id=1的数据已经被加上了排他锁,此处堵塞是等候排他锁开释。
假如我们直接使用以下查询呢
我们看到是可以查询到数据的。
我们再看一下一个事务猎取了同享锁,在其他查询中也只能加同享锁或不加锁。
我们看到是可以查询数据的,但加排他锁就查不到,由于排他锁与同享锁不克不及存在统一数据上。
最后我们验证下上面说的mysql InnoDb引擎中update,delete,insert语句主动加排他锁的问题,
此时同享查询处于堵塞,等候排它锁的开释,但是用一般查询能查到数据,由于没用上锁机制不与排他锁互斥,但查到的数据是修改数据此前的老数据。
然后我们提交数据,开释排他锁看下修改后的数据,此时可用排他查,同享查和一般查询, 由于事务提交后该行数据开释排他锁,下面就只显示一般查询,其他的同学们本人去验证。
可以看到结果与预测的一样。
引荐教程:《Mysql教程》
以上就是mysql的同享锁与排他锁详解的具体内容,更多请关注百分百源码网其它相关文章!