2013-02-19 36 views
0

我有问题在提交/回滚之前访问已准备语句中的已修改数据(更新和插入)。例如,考虑下面的块:PostgreSql - 在准备命令中访问已修改的行

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

执行“准备”命令(以及执行所述“提交”命令之前),I neeed获取由交易“为Transaction1”修改的数据之后。我可以使用由事务修改的旧值(使用xmax字段)获取行,还需要事务在提交时写入这些行的值。

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

+0

是不是应该是一个PREPARE ... AS语句或PREPARE TRANSACTION ...语句?我猜测第二个,但是我看不到更新/插入应该播放什么部分。 – 2013-02-19 20:11:01

+0

是一个PREPARE TRANSACTION语句。更新/插入对数据做了一些修改,我需要在调用commit/rollback之前知道这些修改。这回答你的问题? – 2013-02-19 22:36:51

+0

不,您可以随时查看您在自己的交易中所做的更改。你能提供一个你想要做什么和出现什么问题的实例吗? – 2013-02-20 08:27:50

回答

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) 

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

+0

是的,您是对的:我无法准备提交事务,然后获取其写入集。我所做的工作是在过程中返回我需要的数据(写入集) – 2013-02-20 23:08:45

1

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

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

主席Pierpaolo