文章目录
9.重新认识MySQL锁
9.1MySQL锁概述
- 锁是计算机协调多个进程或者线程并发访问某一资源的机制
- 在数据库中除了传统的对计算资源的争抢之外,数据也是供许多用户共享的一种资源,如何保证多线程下的数据一致性是数据库必须解决的一个问题
9.2锁分类
共有四种角度将MySQL锁分类:
- 锁的粒度:
- 全局锁
- 表级锁
- 行级锁
- 页级锁
- 锁的区间:
- 间隙锁
- 临建锁
- 锁的性能:
- 乐观锁
- 悲观锁
- 锁的级别:
- 共享锁(读锁)
- 排他锁(写锁/独占锁)
9.2.1锁的粒度
- 全局锁:锁住数据库中的所有表
- 表级锁:锁住数据库中的整张表
- 行级锁:锁住对应的行数据
9.2.2锁的区间
-
间隙锁
- 定义:间隙锁用于 锁定一个范围(开区间) 而不是单个行。当事务在范围内的一行上持有锁时,其他事务无法在这个范围内插入新的数据,但是可以在范围之外插入新的数据。
- 举例:假设一个表中的索引列有序且不重复,事务A持有了某个范围内的间隙锁,这个范围可能是一段索引范围,比如(10,20),这时其他事务无法在这个范围内插入新的行。
-
临建锁
- 定义::临建锁是一种结合了行锁和间隙锁的锁类型,它在锁定一个范围时同时锁定了该范围内的行以及范围之间的间隙。
- 举例:考虑一个范围查询,比如查询索引列值在(10,20)之间的行,临建锁会锁定这个范围内的行,同时锁定范围之间的间隙,防止其他事务在这个范围内插入新的行或者改变已有行的值。
9.2.3锁的性能
-
乐观锁:
-
定义:乐观锁认为数据在被操作时很少发生冲突,因此在访问数据时不会立即加锁,而是在更新数据时检查数据是否被其他事务修改过,如果没有则更新成功,否则进行回滚或者重试。
-
举例:在MySQL中,可以使用乐观锁的方式是在更新数据时检查数据的版本号或者时间戳是否与当前操作一致
UPDATE table_name SET column1 = value1, version = new_version WHERE id = x AND version = old_version;
-
-
悲观锁:
-
定义:悲观锁认为数据在被操作时会发生冲突,因此在访问数据之前会先加锁,确保其他事务无法修改该数据,直到当前事务完成操作并释放锁。
-
举例:
-