SELECT....FOR UPDATE的启用行级锁的注意事项

本文介绍了在并发访问中,SELECT...FORUPDATE如何实现数据一致性,通过行级锁锁定数据,避免竞态条件。讨论了主键、唯一索引和普通索引/字段的不同影响,以及如何处理Lockwaittimeout问题。
摘要由CSDN通过智能技术生成

背景:在并发访问的环境中,如多个事务同时访问并尝试修改同一行数据时为了解决数据一致性问题,使用SELECT ... FOR UPDATE允许事务在选择数据的同时,锁定这些数据,防止其他事务修改这些数据,直到当前事务完成并释放锁。从本质上,SELECT ... FOR UPDATE是一种悲锁的用法,一般情况下,只会锁住一行数据,但是如果没有正确使用的话,会把整张表都锁住的。

注意:

  • 在mysql中Update、Delete、Insert命令都是会启用行级锁,如果Select命令要启动行级锁需要加上FOR UPDATE
  • 而表级锁的命令包括ALTER TABLE、LOCK TABLES以及一些DDL语句(例如CREATE、DROP和TRUNCATE)。这些命令会锁定整个表

 

对于主键字段:

假设现在有一个事务1使用FOR UPDATE加行级锁(这里还没有提交事务):

START TRANSACTION;  -- 开启事务
SELECT * FROM user_info WHERE id = 1 FOR UPDATE;  -- 加行锁

此时有事务2执行以下命令

UPDATE user_info SET amount = 10000 WHERE id = 1

会报错:

 1205 - Lock wait timeout exceeded; try restarting transaction

这就表明当一个事物使用行级锁并且还没有提交的时候,行级锁不会释放,另一事务就无法对数据进行操作。

总结一下SELECT ... FOR UPDATE加锁的情况:

  • 主键字段:加行锁。
  • 唯一索引字段:加行锁。
  • 普通索引字段:加行锁。
  • 普通字段:加表锁。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kkoneone11

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值