PostgreSql - 在prepare命令中访问已修改的行

时间:2013-02-19 18:57:05

标签: postgresql transactions

我有一个问题是在提交/回滚之前在预准备语句中访问修改后的数据(更新和插入)。例如,考虑以下块:

BEGIN;    
do some update;   
do some insert;    
PREPARE 'transaction1';

执行'prepare'命令后(以及执行'commit'命令之前),我需要获取事务'transaction1'修改的数据。我可以使用事务修改的旧值(使用xmax字段)获取行,但是我还需要事务在提交时写入这些行的值。

Postgres需要将这些值存储在某个地方,以便在需要时提交事务,所以我的问题是:如何访问这些值?

2 个答案:

答案 0 :(得分:1)

谢谢理查德,你是对的。我无法获取“准备好”的交易的修改。我所做的工作是在调​​用PREPARE语句之前获取由事务中间化的值。

    BEGIN;
    execute my_stored_procedure;
    fetch modified rows;
    PREPARE TRANSACTION my_stored_procedure;'

主席Pierpaolo

答案 1 :(得分:0)

好的 - 我认为您的问题是PREPARE TRANSACTION没有按照您的想法行事。

您准备作为事务中的最后一件事并保存它以便您以后可以提交。它通常用于需要同时更新多个数据库的情况。您可以同时在两者上进行PREPARE事务,然后在两者上同时执行COMMIT PREPARED(尽可能)。当问题发生时,这会减少窗口,让一个数据库与另一个数据库失去一步。

=> BEGIN;
BEGIN
richardh=> SELECT * FROM foo;
 app_id | rule_id
--------+---------
      1 |      10
      1 |      20
      2 |      10
(3 rows)

=> INSERT INTO foo VALUES (3,30);
INSERT 0 1
=> PREPARE TRANSACTION 'abc';
PREPARE TRANSACTION
=> SELECT * FROM foo;
 app_id | rule_id
--------+---------
      1 |      10
      1 |      20
      2 |      10
(3 rows)

=> COMMIT PREPARED 'abc';
COMMIT PREPARED
=> SELECT * FROM foo;
 app_id | rule_id
--------+---------
      1 |      10
      1 |      20
      2 |      10
      3 |      30
(4 rows)

您可能希望发布另一个问题来描述您要解决的问题,可能会有不同的方法。