锁
全局锁
全局锁可以将整个数据库实例加锁:
锁住整个数据库,只允许读取数据
方法一:
mysql> flush tables with read lock; //加锁
Query OK, 0 rows...什么是幻读
假设数据库数据为:
id主键 b 索引 c
1 2 3
5 6 8
10 9 13
当启用事务时:
事务1 事务2 事务3
Q1: begin;查询 b=6的数据,for update...,将无法锁住,就会导致出现在可重复读时却出现幻读的情况,所以mysql引入了间隙锁
间隙锁如何解决幻读
在插入数据时,mysql额外增加了间隙锁的概念,在插入表数据后,会生成 "前开后闭"的间隙区间:...在操作数据时,将自动给此条数据加锁:
临键锁
临键锁就是 行锁+间隙锁的组合
共享锁和排他锁
共享锁(S锁) 排它锁(X锁)其实就是我们说的读锁和写锁
在查询语句中,mysql自动加 S锁,其他连接也只能加.../排他锁时,需要先对此表进行加意向(共享/排他)锁
此锁为mysql自动增加,无需用户干预
乐观锁和悲观锁
乐观锁 是指业务层面上,对修改数据不会冲突的情况做出的乐观判断,先进行更新数据,再进行判断.