我对我们使用SELECT FOR UDPATE
的目的有疑问?它到底做了什么?
我有表,我需要从表中选择行并更新相同的行。
例如:
选择查询
SELECT * from t1 WHERE city_id=2 for update
更新查询
UPDATE t1 SET final_balance = final_balance - 100 WHERE city_id ='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保留。