为什么要使用SELECT FOR UPDATE?

时间:2015-01-09 17:29:40

标签: mysql transactions innodb

我对我们使用SELECT FOR UDPATE的目的有疑问?它到底做了什么?

我有表,我需要从表中选择行并更新相同的行。

例如:

选择查询

SELECT * from  t1 WHERE city_id=2 for update

更新查询

UPDATE t1 SET final_balance = final_balance - 100 WHERE city_id ='2'

我的问题 - 这是否真的会锁定读取操作,直到我的更新完成,或者它究竟处理了什么?

我的想法是,在我的更新完成之前,没有人无法从此行读取/更新。

谢谢!

2 个答案:

答案 0 :(得分:11)

SELECT ... FOR UPDATE将使用write(独占)锁定锁定记录,直到事务完成(提交或回滚)。

要选择记录并确保在更新记录之前未对其进行修改,您可以启动事务,使用SELECT ... FOR UPDATE选择记录,执行一些快速处理,更新记录,然后提交(或回滚)交易。

如果在事务之外使用SELECT ... FOR UPDATE(自动提交ON),则锁定仍将立即释放,因此请务必使用事务来保留锁定。

为了提高性能,请不要长时间保持事务处理,因此应立即更新。

答案 1 :(得分:0)

仍然,我们使用SELECT FOR UPDATE而不是UPDATE的目的是什么? 选择背后的基本理性是什么?

以下是我的想法- SELECT ... FOR UPDATE应该更可能与SELECT而不是UPDATE进行比较。原因是SELECT不保留排他锁,而SELECT ... FOR UPDATE保留。