网站死链如何修改,做长图文网站,简易的网站模板,内蒙古建设厅网站查询正常insert数据#xff0c;MySQL并不会显式加锁#xff0c;而是通过聚簇索引的trx_id索引作为隐式锁来保护记录的。比如两个事务对一个非唯一的索引情况添加#xff0c;会造成幻读 但在某些特殊情况下#xff0c;隐式锁会转变为显式锁#xff1a;
记录之间有间隙锁inser…正常insert数据MySQL并不会显式加锁而是通过聚簇索引的trx_id索引作为隐式锁来保护记录的。比如两个事务对一个非唯一的索引情况添加会造成幻读 但在某些特殊情况下隐式锁会转变为显式锁
记录之间有间隙锁insert的记录与已有记录的唯一索引冲突
记录之间有间隙锁
每插入一条新记录都需要看一下待插入记录的下一条记录上是否已经被加了间隙锁如果已加间隙锁此时会生成一个插入意向锁然后锁的状态设置为等待状态PSMySQL 加锁时是先生成锁结构然后设置锁的状态如果锁状态是等待状态并不是意味着事务成功获取到了锁只有当锁状态为正常状态时才代表事务成功获取到了锁现象就是 Insert 语句会被阻塞。
# 事务 A
mysql begin;
Query OK, 0 rows affected (0.01 sec)mysql select * from t_order where order_no 1006 for update;# 事务 B 插入一条记录
mysql begin;
Query OK, 0 rows affected (0.01 sec)mysql insert into t_order(order_no, create_date) values(1010,now());
### 阻塞状态。。。。可以看到事务 B 的状态为等待状态LOCK_STATUS: WAITING因为向事务 A 生成的 next-key 锁记录锁间隙锁范围1005, ∞] 中插入了一条记录所以事务 B 的插入操作生成了一个插入意向锁LOCK_MODE: X,INSERT_INTENTION锁的状态是等待状态意味着事务 B 并没有成功获取到插入意向锁因此事务 B 发生阻塞。
遇到唯一键冲突
插入失败会对这条记录上S型锁
如果主键索引重复插入新记录的事务会给已存在的主键值重复的聚簇索引记录添加 S 型记录锁。如果唯一二级索引重复插入新记录的事务都会给已存在的二级索引列值重复的二级索引记录添加 S 型 next-key 锁。但假设有这么一种情况目前表里有二级索引id1~5的数据记录事务A插入一个id6是可以的不会被阻塞也没有上显式锁其实只有隐式锁。但假设事务B想再插入id6的数据A对id6的隐式锁会升级为显式X锁B此时相当于想申请id6的S锁会被阻塞