![](/img/trans.png)
[英]How to convert SQL query with LOCK TABLE into stored procedure with SELECT...FOR UPDATE
[英]Use ResultSet of SELECT...FOR UPDATE in MySQL Stored Procedure
我正在使用 MySql 5.7 嘗試創建一個存儲過程,該過程將更新事務中的一組行並返回已更新的行。 創建鎖后,我會更新這些行,但無法弄清楚如何使用從SELECT...FOR UPDATE
語句返回的 ID。 相反,我必須在更新語句中再次掃描表以查找我剛剛鎖定的行。 這是我的程序的一個例子。
DELIMITER //
CREATE PROCEDURE cleanUp()
BEGIN
START TRANSACTION;
SELECT * FROM t WHERE t.state = 'foobar' AND t.value < 10 FOR UPDATE;
UPDATE t SET t.state = 'fizzbuzz' WHERE t.state = 'foobar' AND t.value < 10;
COMMIT;
END //
我寧願不必為t.state = 'foobar' AND t.value < 10
掃描兩次表。 我還想保證我只更新我剛剛鎖定的行,而不更新可能已更改以滿足交易中的標准的其他行。
有沒有辦法在UPDATE
語句中使用SELECT..FOR UPDATE
的結果,這樣我就可以通過 id 更新行?
注意:我已嘗試將結果加載到臨時表中並使用 cursor,但兩者均無效。
MySQL 不能將變量聲明為表,因此您需要將 select 寫在 FROM 子句中,例如可以像下面的查詢一樣執行 IN 子句
CREATE TABLe t(id int, state varchar(10), value int)
INSERT INTO t VALUEs(1,'foobar',1),(2,'foobar',1),(3,'foobar',1)
CREATE PROCEDURE cleanUp() BEGIN START TRANSACTION; UPDATE t SET t.state = 'fizzbuzz' WHERE id IN (SELECT id FROM (SELECT id FROM t WHERE t.state = 'foobar' AND t.value < 10 FOR UPDATE) t1 ); COMMIT; END
CALL cleanUp()
SELECT * FROM t
編號 | state | 值 -: |:------ | ----: 1 | 嘶嘶聲 | 1 2 | 嘶嘶聲 | 1 3 | 嘶嘶聲 | 1個
db<> 在這里擺弄
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.