首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL行级锁定

问MySQL行级锁定
EN

Stack Overflow用户
提问于 2016-09-24 00:02:36
回答 1查看 1.5K关注 0票数 3

我不确定行级锁是如何工作的,但这里是我的问题我有一个表T (id int,balance int )(引擎= InnoDB ),我想锁定ID = 1的行,所以我像这样启动了一个事务:

代码语言:javascript
复制
start transaction ; 
select * from T where ID = 1 FOR UPDATE ; 

在发送commit之前,我想尝试一下行是否真的被锁定。因此,我启动了另一个会话,并键入:

代码语言:javascript
复制
UPDATE T set balance = balance  + 100 where ID = 1 ;

在这里我清楚地看到我在等待锁( 30秒后超时)。

但是当我输入的时候:

代码语言:javascript
复制
UPDATE T set balance = balance  + 8500 where ID = 2 ;

我也在等待锁定,那么我怎么能只锁定ID =1的行而不锁定整个表呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-24 02:21:05

您需要在id列上添加索引,以确保获得行级锁。SELECT ... FOR UPDATE锁定为执行查询而读取的所有行,而不仅仅是实际选择的行。如果没有索引,它必须执行全表扫描,因此每一行都会被锁定。

对于索引,它只需在该索引条目中设置一个锁,而不必读取任何其他行,因此不会锁定任何其他行。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39665093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档