一、特点
偏向InnoDB存储引擎,开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度最高。

二、复习老知识

更新丢失

脏读

比如说,我改错了,你拿着我改错的那个值去干活。
不可重复读

幻读

事务隔离级别

三、案例分析
3.1 建表sql
CREATE TABLE test_innodb_lock (a INT(11), b VARCHAR(16)) ENGINE = INNODB;
INSERT INTO test_innodb_lock VALUES(1, 'b2');
INSERT INTO test_innodb_lock VALUES(3, '3');
INSERT INTO test_innodb_lock VALUES(4, '4000');
INSERT INTO test_innodb_lock VALUES(5, '5000');
INSERT INTO test_innodb_lock VALUES(6, '6000');
INSERT INTO test_innodb_lock VALUES(7, '7000');
INSERT INTO test_innodb_lock VALUES(8, '8000');
INSERT INTO test_innodb_lock VALUES(9, '9000');
INSERT INTO test_innodb_lock VALUES(1, 'b1');
create index test_innodb_a_ind on test_innodb_lock(a);
create index test_innodb_lock_b_ind on test_innodb_lock(b);
select * from test_innodb_lock;
3.2 行锁定基本演示


两个session都把自动提交功能关闭。第一个session修改一条数据,然后,查询,查到的是更新后的数据。第二个session查询,查到的是更新前的数据。因为mysql的默认隔离级别是RR,所以,session2读不到session1尚未提交的数据(也就是,不会出现脏读)。

session1 commit之后,session2依然查不到更新之后的数据。

session2也提交,那么session2就查到session1更新之后的数据。

session1更新一条数据,session1查到自己的更新。session2更新同一条数据,由于session1尚未提交,session2阻塞。

session1提交,session2就不再阻塞。这里说明的是,不会出现更新丢失。
修改不同的行,互不相关


3.3 无索引行锁升级为表锁
当前数据库状态

行锁,修改两条记录,各不相关

案例中想演示的是,索引列b的值不加单引号,的时候,索引失效,会变成全表扫描。但是我自己试验的时候,没有发生。

3.4 间隙锁危害

由于表中没有a=2的记录。在范围查找的时候,a>1 and a<6这个范围,session2的insert语句会阻塞。

3.5 如何锁定一行

四、案例结论

五、行锁分析


六、优化建议


InnoDB锁机制解析
本文深入探讨了MySQL中InnoDB存储引擎的锁机制,包括其特点、不同事务隔离级别下的行锁行为、以及实例分析,如行锁定、间隙锁的危害等,通过具体案例帮助理解并发控制机制。
1719

被折叠的 条评论
为什么被折叠?



