共享锁(S)和排它锁(X)之间不得不说的那些事!

共享锁(S):

        小明和小胖是好朋友,有一天他们俩得到了一份纸质版且纸比较破武功秘籍,为了让这份武功秘籍不再丢失什么内容,于是就用一个玻璃盒子存储起来。

        这时候小胖提议在盒子上加了一把锁,保护好里面的内容不被破坏。

        加上锁之后,大家都能看,但是不能修改,难度增大了!大家都看到你们加锁了,并且这东西是免费的,所以我也要加锁,于是

        这秘籍的外表框上加上了很多的锁,这些锁统称为共享锁(S)

        我们通过图可以直到,共享属锁加上之后,我们只能看到秘籍(内容),但是想撕去一点点秘籍或修改上面的内容都不行,所以大家都只能看,不能修改,这就是共享锁为什么又称为读锁的原因。

        如果要修改上面的内容或者换一本秘籍在玻璃里面展示的话,这个时候需要将所有的锁都去除掉,才能操作,否则就只能看。

排它锁(X):

        同样,有一本武功秘籍,这次被小胖捡到了,于是:



        这个时候小明来了,看到之后

  于是,这个箱子被小胖加上了排它锁(X),别人看不到也修改不了里面的内容,同时别人想加上其他锁也不能。


      最后,不过小胖给了小明一个排它锁的钥匙,这个时候小明也能看箱子里面的内容,同时也可以修改箱子里面的内容。

通过上面的两个故事应该可以看出:

        共享锁(S):如果事物T对数据A加上共享锁之后,则其他事务只能对数据A加上共享锁,不能加排它锁,而获准共享锁的事物只能读取里面的数据,而不能修改里面的数据。

        排它锁(X):如果事物T对数据A加上排它锁之后,则其他事物不能再对数据A加任何操作,但是获准排它锁的事物既能读取数据,而且还能修改数据。

共享锁和排它锁的对比:

1.共享锁只用于表级,排他锁用于行级。

2.加了共享锁的对象,可以继续加共享锁,不能再加排他锁。加了排他锁后,不能再加任何锁。
3.比如一个DML操作,就要对受影响的行加排他锁,这样就不允许再加别的锁,也就是说别的会话不能修改这些行。同时为了避免在做这个DML操作的时候,有别的会话执行DDL,修改表的定义,所以要在表上加共享锁,这样就阻止了DDL的操作。
4.当执行DDL操作时,就需要在全表上加排他锁。

        

猜你喜欢

转载自blog.csdn.net/Luojun13Class/article/details/80299630
今日推荐