什么是共享读锁和排他写锁?
① 由非更新(读取)操作创建的锁。其他用户可以并发读取数据,但任何事务都不能获取数据上的排它锁,直到已释放所有共享锁。共享锁(S锁)又称为读锁,若事务T对数据对象A加上S锁,则事务T只能读A, 不能修改A;其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
② 排他锁(X锁),又称为写锁、独占锁,是一种基本的锁类型。若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A。
共享锁(S)与 排它锁(X) 区别:
1、共享锁只用于表级,排他锁用于行级。
2、加了共享锁的对象,可以继续加共享锁,不能再加排他锁。加了排他锁后,不能再加任何锁。
3、比如一个DML操作(数据增删改操作),就要对受影响的行加排他锁,这样就不允许再加别的锁,也就是说别的会话不能修改这些行。同时为了避免在做这个DML操作的时候,有别的会话执行DDL (表结构更改等操作) ,修改表的定义,所以要在表上加共享锁,这样就阻止了DDL操作。
4、当执行DDL操作时,就需要在全表上加排他锁。
总结:
MySQL 执行增删改时:
① 使用到索引的前提下,对索引行执行排它锁(X),对表执行共享锁(S),防止在此期间有别的会话执行 DDL 操作;
② 没有使用到索引的前提下,则会锁住整个表(非常危险的操作);