锁
全局锁
全局锁可以将整个数据库实例加锁:
锁住整个数据库,只允许读取数据
方法一:
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额外增加了间隙锁的概念,在插入表数据后,会生成 "前开后闭"的间隙区间:...普通索引下:
如果在存在的索引中加锁,将会在索引2边进行间隙锁加锁
如果在不存在的索引中加锁,将会在此索引间隙中加锁
行锁
行锁是在索引记录上的锁,当表中没有索引时,innodb会自动创建个隐藏主键索引用于做行锁...S锁查询,不能加写锁更新
在insert,update,delete 语句中,将自动加 X锁,其他语句不能对锁住的数据操作(包括读取)
意向锁
意向锁是mysql表级锁,
当需要对数据进行加 共享锁