Mysql

InnoDB行锁升级为表锁的问题

2020-03-25  本文已影响0人  我叫于牛逼

前几天跟朋友聊天,聊起Mysql锁的问题。他突然问我为什么行锁会变成表锁。
由于解释半天,他还没搞明白,因此用图形化界面给他演示一下

首先准备一张简单的测试表

0F3B30CAA2525949EFA66E4EAC001A32.jpg

准备两个窗体,且同时开启事务


77AA6BF61F044740E9091656B4178740.jpg

Session 1
begin;
select * from t1 where name = '张三' for update;

ROLLBACK
COMMIT

/****************************************************************************/
Session 2
begin;
select * from t1 where id = 3 for update;

ROLLBACK
COMMIT

session2 因为行锁升级为表锁一直在等待

InnoDB 行级锁是通过给索引上的索引项加锁来实现的,InnoDB行级锁只有通过索引条件检索数据,才使用行级锁;否则,InnoDB使用表锁 在不通过索引(主 键)条件查询的时候,InnoDB是表锁而不是行锁。

总结:就是在没有使用索引的情况下InnoDB就会使用表级锁(共享锁不会有这个情况)

最后给出事务使用的几点建议

上一篇 下一篇

猜你喜欢

热点阅读