23

我对我们使用什么目的有疑问SELECT FOR UDPATE?它究竟是做什么的?

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

例如:

选择查询

SELECT * from  t1 WHERE city_id=2 for update

更新查询

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

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

我的想法是在我的更新完成之前没有人可以读取/更新这些行。

谢谢!

4

1 回答 1

43

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

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

如果SELECT ... FOR UPDATE在事务之外使用(autocommit ON),那么锁仍然会被立即释放,所以一定要使用事务来保留锁。

出于性能考虑,不要将事务保持打开很长时间,因此应立即进行更新。

于 2015-01-09T20:27:14.900 回答