3

さまざまなデータベース タイプ (MSSQL、Postgres、および MySQL) でデータベースを更新する、PHP/Yii に基づく非常に広範な PHP 更新スクリプトがあります。

スクリプト全体がトランザクション内で実行されます。ただし、クエリ エラーにつながるステートメントがいくつかあります (たとえば、特定のキーがテーブルに既に存在する場合など)。これらをtry/catchステートメントで囲みました-これはこれまでのところMySQLで正常に機能します

ただし、Postgres では、無効なクエリが発行されると、トランザクションは自動的に失敗します。次のすべてのステートメントに対して、次のエラー メッセージが表示されます。

CDbCommand failed to execute the SQL statement: SQLSTATE[25P02]: In failed sql transaction: ERROR: current transaction is aborted, commands ignored until end of transaction block

しかし、いつロールバックするか、またはエラーをクリアしてトランザクションを続行する方法をアプリケーションで決定したいので、Postgres がトランザクションを続行する必要があります。

どうやってするか?

4

1 に答える 1

5

そのためにセーブポイントを使用します。

BEGIN; -- transaction starts here

-- do things if you want

SAVEPOINT my_savepoint;

-- failing statement here
-- all other statements are ignored

ROLLBACK TO SAVEPOINT my_savepoint;

-- continue your transaction starting from my_savepoint

COMMIT;
于 2012-12-23T11:21:57.243 に答える