0

コミット/ロールバックの前に、準備されたステートメントで変更されたデータ (更新および挿入) にアクセスする際に問題があります。たとえば、次のブロックを考えてみましょう。

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

「prepare」コマンドを実行した後 (および「commit」コマンドを実行する前) に、トランザクション「transaction1」によって変更されたデータをフェッチする必要があります。(xmax フィールドを使用して) トランザクションによって変更された古い値を持つ行をフェッチできますが、コミット時にトランザクションがこれらの行に書き込む値も必要です。

Postgres は、必要なときにトランザクションをコミットするためにこれらの値をどこかに保存する必要があるため、私の質問は次のとおりです。これらの値にアクセスするにはどうすればよいですか?

4

2 に答える 2

1

ありがとう、リチャード、あなたは正しいです。「準備済み」トランザクションの変更を取得できません。私が行った回避策は、PREPARE ステートメントを呼び出す前に、トランザクションによって中間化された値をフェッチすることです。

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

ピエルパオロ

于 2013-02-21T11:24:07.470 に答える
0

OK - あなたの問題は、PREPARE TRANSACTIONがあなたが思っていることをしないことだと思います。

トランザクションの最後に PREPARE を実行すると、後でコミットできるように保存されます。複数のデータベースを同時に更新する必要がある場合によく使用されます。両方でトランザクションを 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)

解決しようとしている問題を説明する別の質問を投稿したい場合があります。別のアプローチがあるかもしれません。

于 2013-02-20T13:01:33.283 に答える