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 如何锁定一行

 

四、案例结论

 

五、行锁分析

 

六、优化建议

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值