![](/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.