INNODB的几种锁
共享锁(S-LOCKING),允许一个事务去读一行,阻止其它事务获得相同数据集的排它锁
排它锁(X-LOCKING),允许获得排它锁的事务更新数据,阻止其它事务取得相同数据集的共享读锁和排它锁
INNODB还独有实现了2种锁
意向共享锁(IS),事务打算给数据行加共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁
意向独占锁(IX),事务打算给数据行加排它锁,事务在给一个数据行加排它锁前必须先取得该表的IX锁
Innodb 行级别的锁基于索引实现的 支持并发和一致性
注意:
1) 在不通过索引条件查询的时候,innodb使用的是表锁(默认地,全表所有行加锁,和表级别锁相当,例外条件是RC+innodb_locks_unsafe_for_binlog组合选项)而不是细粒度行锁
2) 由于MYSQL的行锁针对索引加锁,不是针对记录加的锁,所以虽然时访问不同行的记录,但是如果是使用相同的索引键,则会出现锁冲突
加共享锁:select * from xx where ,….. lock in share mode
加排它锁:select * from xx where ….. for update,update delete 也是加排它锁
| X | IX | S | IS |
X | 冲突 | 冲突 | 冲突 | 冲突 |
IX | 冲突 | 兼容 | 冲突 | 兼容 |
S | 冲突 | 冲突 | 兼容 | 兼容 |
IS | 冲突 | 兼容 | 兼容 | 兼容 |
在5.1以前,只能通过showfull processlist,show engineinnodb status等命令查看锁状态
5.1以后能从视图查看锁 事务状态 information_schma 库下面
Innodb_trx innodb_locks innodb_lock_waits
看下innodb_trx表中常用的字段
Trx_id:innodb存储引擎内部唯一事务ID
Trx_state:当前事务的状态
Trx_started:事务开始时间
Trx_wait_started:事务开始等待时间
Trx_mysql_thread_id MYSQL中的线程ID show processlist 显示结果
Trx_query:事务运行的SQL语句
看下innodb_locks表中,几个最常用的字段:
Lock_id:锁的ID
Lock_trx_id:事务ID
LOCK_MODE:锁的模式
LOCK_TYPE:所得类型表锁还是行锁
LOCK_TABLE:要加锁的表
LOCK_INDEX:锁的索引
LOCK_SPACE:innodb存储引擎表空间ID号
LOCK_PAGE:被锁住的页的数量,若是表锁,则该值为null
LOCK_REC:被锁住行的数量,若是表锁则该值为NULL
LOCK_DATA:被锁住的行的主键值,若是表锁时,则该值为NULL;
通过select* from information_schema.INNODB_LOCK可查看
innodb_lock_waits最常用的几个字段
Requesting_trx_id:申请资源的事务ID
Request_lock_id:申请锁的ID
Blocking_trx_id:阻塞锁的ID
哪个事务被哪个事务阻塞很明显通过该innodb_lock_waits看
一致性非锁定在MVCC读取当前数据库里面的数据在读取的数据正在被修改不会产生锁等待(对当前数据拍照片)读没有加锁 没有加共享锁 没有被阻塞
访问不同的记录不会发生等待 由于MySQL的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然时访问不同的行记录。但是如果是使用相同的索引键,会出现锁冲突的,应用设计的时候要注意
待续...