1

3つのSQLタイプ(MySql、SQLite、PostgreSQL)の場合、セーブポイントを同じように処理する必要があります。

これで、1つの大きなトランザクションでデータベース内のさまざまなエントリを変更するアプリケーションができました。プログラムの特別な動作のために、ネストされたトランザクションが必要です。

だから問題は、私が次のようなものを作成した場合です:

BEGIN TRANSACTION;
--random insert/update statements
SET SAVEPOINT sp1;
--more random inserts/updates
SET SAVEPOINT sp2;
--inserts n stuff

(はい、構文は正しくない可能性があります。これは単なる例です)

したがって、2つの保存ポイント間でロールバックを実行でき、後で挿入/更新をロールバックせずsp1に実行できるかどうかを知りたいですか?sp2sp2

4

1 に答える 1

5

セーブポイントはあなたが望むことをしません。セーブポイントにロールバックすると、その後のセーブポイントが作成されたかどうかに関係なく、そのセーブポイント以降のすべてがロールバックされます。

セーブポイントは「スタック」のようなものだと考えてください。スタックの真ん中から何かを引き出すことはできません。必要なレイヤーまですべてを削除する必要があります。

あなたはおそらく自律的なトランザクションを探しています。使用したいデータベースはどれもそれらをサポートしていません。PostgreSQL では、dblink モジュールを使用してデータベースへの新しい接続を作成し、それを操作することでこれを回避できます。http://www.postgresql.org/docs/current/static/dblink.htmlを参照してください。MySQL や SQLite がどのようなソリューションを提供しているかはわかりませんが、探している用語がわかったので、Google がお手伝いします。

可能であれば、このアプリケーション設計要件を回避する方法を見つけることをお勧めします。アプリケーションで 2 つのデータベース接続と 2 つのトランザクションを使用して必要なことを行い、必要に応じて 2 つを調整します。

于 2013-02-06T22:55:48.073 に答える