select * from xxx lock in share mode;
select * from xxx for update;

Record Lock
单个行记录上的锁
Gap Lock
间隙锁,锁定一个范围,但不包含记录本身, 全开区间
解决幻读问题
仅REPEATABLE READ级别支持间隙锁
产生死锁重要原因之一
Next-Key Lock (记录锁+间隙锁)
产生死锁重要原因之一
锁定一个范围,并且锁住记录本身,左开右闭区间
仅REPEATABLE READ级别支持间隙锁
Insert Intention Lock (插入意向锁)
插入意向锁,insert操作的时候产生。
在多事务同时写入不同数据至同一索引间隙的时候,并不需要等待其他事务完成,不会发生锁等待。
提升插入的并发性能。
假设有一个记录索引包含键值4和7,两个不同的事务分别插入5和6,每个事务都会产生一个加在4-7之间的插入意向锁,获取在插入行上的排它锁,但是不会被互相锁住,因为数据行并不冲突。
产生死锁重要原因之一
AUTO-INC Lock (AI锁)
比行插入方式,较低概率造成B+数的分裂,所以它的性能更高
锁兼容

如果有事务已经持有insert Intention key, 这个时候不会影响其他事务
如果有事务想要执行insert Intention key 但是这个时候已经有事务持有了GAP或者NEXT-KEY, 则会产生阻塞
# set transaction isolation level read uncommitted;
# set transaction isolation level read committed;
# set transaction isolation level repeatable read;
set transaction isolation level SERIALIZABLE;
begin
select * from table;
update table_a set name='lsy';
delete from table_b;
commit


事务A可以读到事务B未提交的数据
两次读取同一条记录,读到了不一样的结果,因为有其他事务对该数据做了修改
两次读取同一范围内的记录,结果的集合不一样
由于repeatable read中规定:读取事务开始前前的版本行数据,那么在该隔离级别下,不管该事务中对改行数据做什么操作,该数据都将不变
该问题已经被数据库修复,数据库将拒绝该操作,
该问题会将数据回滚为事务开始之前的数据
比如事务a读取数据后做了回滚,在这期间,事务B对该数据做了修改,结果事务a回滚时候将使得事务B的操作无效
两个事务同时写一个数据,后提交的事务覆盖掉了先提交的数据
使用 wait-for graph的方式进行死锁检测
异常报错:deadlock found when trying to get lock
-- 开启标准监控
CREATE TABLE innodb_monitor (a INT) ENGINE=INNODB;
-- 关闭标准监控
DROP TABLE innodb_monitor;
-- 开启锁监控
CREATE TABLE innodb_lock_monitor (a INT) ENGINE=INNODB;
-- 关闭锁监控
DROP TABLE innodb_lock_monitor
-- 开启标准监控
set GLOBAL innodb_status_output=ON;
-- 关闭标准监控
set GLOBAL innodb_status_output=OFF;
-- 开启锁监控
set GLOBAL innodb_status_output_locks=ON;
-- 关闭锁监控
set GLOBAL innodb_status_output_locks=OFF;
-- 将死锁信息记录在错误日志中
set GLOBAL innodb_print_all_deadlocks=ON;
-- 查看事务
select * from information_schema.INNODB_TRX;
-- 查看锁
select * from information_schema.INNODB_LOCKS;
-- 查看锁等待
select * from information_schema.INNODB_LOCK_WAITS;