MySql(二十五)--数据库锁机制-行锁

一、特点

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

MySql(二十五)--数据库锁机制-行锁

二、复习老知识

MySql(二十五)--数据库锁机制-行锁

更新丢失

MySql(二十五)--数据库锁机制-行锁

脏读

MySql(二十五)--数据库锁机制-行锁

比如说,我改错了,你拿着我改错的那个值去干活。

不可重复读

MySql(二十五)--数据库锁机制-行锁

幻读

MySql(二十五)--数据库锁机制-行锁

事务隔离级别

MySql(二十五)--数据库锁机制-行锁

 

三、案例分析

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 行锁定基本演示

MySql(二十五)--数据库锁机制-行锁

MySql(二十五)--数据库锁机制-行锁

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

MySql(二十五)--数据库锁机制-行锁

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

MySql(二十五)--数据库锁机制-行锁

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

 

MySql(二十五)--数据库锁机制-行锁

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

MySql(二十五)--数据库锁机制-行锁

session1提交,session2就不再阻塞。这里说明的是,不会出现更新丢失。

 

修改不同的行,互不相关

MySql(二十五)--数据库锁机制-行锁

 

MySql(二十五)--数据库锁机制-行锁

 

3.3 无索引行锁升级为表锁

当前数据库状态

MySql(二十五)--数据库锁机制-行锁

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

MySql(二十五)--数据库锁机制-行锁

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

MySql(二十五)--数据库锁机制-行锁

3.4 间隙锁危害

MySql(二十五)--数据库锁机制-行锁

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

MySql(二十五)--数据库锁机制-行锁

 

 

3.5 如何锁定一行

 

 

 

 

 

四、案例结论

 

 

五、行锁分析

 

 

六、优化建议