我的交易看起来像这样:
BEGIN;
SELECT last_table_row;
...some long queries with last_table_row data...
DELETE selected_last_table_row;
COMMIT;
如果我同时运行此事务两次,则第二个将使用相同的last_table_row项作为第一个事务(从psql控制台尝试),这是不希望的。我应该如何处理这种类型的交易以确保安全并且没有干扰交易?
答案 0 :(得分:1)
使用SELECT FOR UPDATE。
如果指定FOR UPDATE,FOR NO KEY UPDATE,FOR SHARE或FOR KEY SHARE,则SELECT语句将锁定所选行以防止并发更新。
Here是关于The Locking Clause
的文档。
答案 1 :(得分:1)
除了SELECT FOR UPDATE,考虑到您在事务结束时删除该行,您也可以在开始复制到临时表时将其删除:
BEGIN;
CREATE TEMP TABLE last_table_row ON COMMIT DROP AS
WITH ltr AS (
DELETE FROM yourtable
WHERE id = (SELECT MAX(id) FROM yourtable)
RETURNING *)
SELECT * FROM ltr;
...some long queries with last_table_row data...
COMMIT;