参考文章:
MySQL 有哪些锁?_小林coding的博客-CSDN博客_mysql中有哪几种锁
共享锁和排他锁的区别是什么? · 秦浦华/学习 - Gitee.com
1. 为什么要加锁
锁是一个数据库重要概念,主要用于多用户环境下保证数据库完整性和一致性,解决多用户共同操作时产生的丢失更新、脏读、不可重复读和幻觉读等问题。
- 丢失更新:当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,会发生丢失更新问题;(如第二个人更改的内容覆盖了第一个人更改的内容。)
- 脏读:指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。(第一个人改完还没保存的内容被第二个人读取到,之后第一个人又改回来了...)
- 不可重复读:指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。(第一个人两次读取到的数据可能不一样了。)
- 幻觉读:指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样
所以要加锁避免上述问题呀!
2. Mysql加锁的类型
3. 共享锁&排他锁
- 共享锁:如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。
- 排他锁:如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。
1、共享锁只用于表级,排他锁用于行级。
2、加了共享锁的对象,可以继续加共享锁,不能再加排他锁。加了排他锁后,不能再加任何锁。
3、比如一个DML操作(数据增删改操作),就要对受影响的行加排他锁,这样就不允许再加别的锁,也就是说别的会话不能修改这些行。同时为了避免在做这个DML操作的时候,有别的会话执行DDL (表结构更改等操作),修改表的定义,所以要在表上加共享锁,这样就阻止了DDL操作。
4、当执行DDL操作时,就需要在全表上加排他锁。