MySql(二十五)--数据库锁机制-行锁
一、特点
偏向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 如何锁定一行
四、案例结论
五、行锁分析
六、优化建议