使用SELECT

时间:2016-05-19 15:05:03

标签: sql postgresql transactions

我的交易看起来像这样:

BEGIN;
SELECT last_table_row;
...some long queries with last_table_row data...
DELETE selected_last_table_row;
COMMIT;

如果我同时运行此事务两次,则第二个将使用相同的last_table_row项作为第一个事务(从psql控制台尝试),这是不希望的。我应该如何处理这种类型的交易以确保安全并且没有干扰交易?

2 个答案:

答案 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;