为什么使用 SELECT FOR UPDATE?
Why use SELECT FOR UPDATE?
我对我们使用的目的有疑问 SELECT FOR UDPATE
?它具体是做什么的?
我有 2 个 table,我需要 table 中的 select 行并更新相同的行。
例如:
Select查询
SELECT * from t1 WHERE city_id=2 for update
更新查询
UPDATE t1 SET final_balance = final_balance - 100 WHERE city_id ='2'
我的问题 - 这是否真的会锁定读取操作直到我的更新完成,或者它究竟处理了什么?
我的想法是在我更新完成之前没有人可以read/updatefrom/to这一行..
谢谢!
SELECT ... FOR UPDATE
将使用写(独占)锁锁定记录,直到事务完成(提交或回滚)。
到select一条记录并确保它在更新之前不被修改,你可以启动一个事务,select记录使用SELECT ... FOR UPDATE
,做一些快速处理,更新记录,然后提交(或回滚)事务。
如果您在事务之外使用SELECT ... FOR UPDATE
(自动提交开启),那么锁仍然会立即释放,所以一定要使用事务来保留锁。
为了性能,不要让事务打开太久,所以更新应该立即完成。
我对我们使用的目的有疑问 SELECT FOR UDPATE
?它具体是做什么的?
我有 2 个 table,我需要 table 中的 select 行并更新相同的行。
例如:
Select查询
SELECT * from t1 WHERE city_id=2 for update
更新查询
UPDATE t1 SET final_balance = final_balance - 100 WHERE city_id ='2'
我的问题 - 这是否真的会锁定读取操作直到我的更新完成,或者它究竟处理了什么?
我的想法是在我更新完成之前没有人可以read/updatefrom/to这一行..
谢谢!
SELECT ... FOR UPDATE
将使用写(独占)锁锁定记录,直到事务完成(提交或回滚)。
到select一条记录并确保它在更新之前不被修改,你可以启动一个事务,select记录使用SELECT ... FOR UPDATE
,做一些快速处理,更新记录,然后提交(或回滚)事务。
如果您在事务之外使用SELECT ... FOR UPDATE
(自动提交开启),那么锁仍然会立即释放,所以一定要使用事务来保留锁。
为了性能,不要让事务打开太久,所以更新应该立即完成。