share blocking是什么意思好不好

工作需要接触到以下两个mysql sql语法:

從官网上查找到对应的章节,属于Locking Reads里面的内容具体链接如下:

根据官网介绍,这两个语句是在事务内起作用的所涉及的概念是行锁。它們能够保证当前session事务所锁定的行不会被其他session所修改(这里的修改指更新或者删除)两个语句不同的是,一个是加了共享锁而另外一个是加了排它锁可以这么理解,共享锁允许其他事务加共享锁读取但是,不允许其他事务去做修改或者加排它锁。而排它锁显得更加严格鈈允许其他事务加共享锁或者排它锁,更加不允许其他事务修改加锁的行

说到这里,行锁有什么用呢设想下面这种场景:

2) 根据读取到的數据去更新其他数据

假设在1)和2)之间,有个其他的user session刚好修改了你读取的那行数据那么你下面的更新就有可能会出错!因为关联的数据产生叻变化!

行锁就能够保证不会出现上面所说的这种尴尬的场景。

实践了一把下面记录它们的用处:

测试用的表结构并插入一行记录:

这个时候session2更新成功了。

这里也就验证了lock in share mode可以在事务中保证锁定的行不被其他session所更改

这个时候两个session同时持有id = 1这行数据的共享锁。这个时候我们在session 1里面执行update操作:

这个时候session1必须等待session2退出事务或者等待直到锁超时:

这个时候mysql检测到会发生死锁会中断当前事务该语句的执荇,重新开启一个新的事务(应该就是相当于session2先退出事务然后再开启一个事务吧)。

这个时候session1可以更新成功了

上面的例子可以看出使用lock in share mode比較危险,很可能因为其他session同时加了这种锁导致当前session无法进行更新,进而阻塞住

select for update加的是排它锁,所以没有上面lock in share mode所产生的死锁因为一个session加了这种锁,其他session除了读取操作其他操作都不能进行,如更改操作或者加锁,共享锁和排它锁都不可以

还是blocking是什么意思状態,证明其他session的事务不能对已经加了排它锁(for update)的行再加排它锁

当然,如果使用select for update的时候如果锁定当前行的事务一直不退出,将会导致其他進行这个行更改操作的session一直阻塞(没有试是否有超时的情况)

我要回帖

更多关于 blocking 的文章

 

随机推荐