6

誰もMySQL savepoints(直接ORM経由)を使って共有できる経験はありますか?特に自明なWebサービスでは特にそうですか?あなたは実際にどこで使ったことがありますか?彼らは十分に信頼性がありますか(かなり最近のバージョンのMySQLを実行したいと仮定している)か、あまりにも先進的か高価なのでしょうか?ウェブサービスで実際にMySQLセーブポイントを使用していますか?

最後に、誰かが次のユースケースのような経験をしていて、セーブポイントを使用しましたか?特定の作業単位の主なポイントは、同じトランザクション内でOrdersテーブルに行を追加すること(もちろん、注文に関係するものではありません)とOrdersAuditInfoテーブルを更新することです。可能であればOrdersを更新することが不可欠ですが、OrdersAuditInfoテーブルは必須ではありません(たとえば、ファイルにエラーを記録するだけで、全体のトランザクションを続けることは可能です)。

BEGIN; 

INSERT INTO Orders(...) VALUES (...); 
/* Do stuff outside of SQL here; if there are problems, do a 
ROLLBACK and report an error (i.e., Order is invalid in this 
case anyway). */ 

SAVEPOINT InsertAudit; 
INSERT INTO OrdersAudit(...) VALUES(...); 
/* If the INSERT fails, log an error to a log file somewhere and do: */ 
ROLLBACK TO SAVEPOINT InsertAudit; 

/* Always want to commit the INSERT INTO Orders: */ 
COMMIT; 

をしかしここでも、おそらくより良い(あるいは少なくとも、より一般的な)イディオムがあるだろう:低レベルでは、それは次のようになります(警告、擬似SQLは以下の)?完全に異なるトランザクションでOrdersAuditInfoの挿入を行うことはできますが、最終的にCOMMITが処理されない限り、に書き込まれていないことが保証されてうれしいです。

答えて

1

私は、一般にSAVEPOINTを避ける傾向があります。なぜなら、コードを理解して確認するのが非常に難しくなるからです。

投稿した場合、1回の取引でラッピングすることは、Ordersに正確に対応するOrdersAuditレコードがビジネスルールの一部であるかどうかによって異なります。

編集:ご質問をもう一度お読みください。OrdersAuditOrdersの間の保証された対応の必要はありません。だから私はOrdersAuditレコードの挿入のためのトランザクションを使用しません。

+0

OrdersAuditをトランザクション全体の一部にしたい理由は、何らかの理由でCOMMIT時間にOrdersへの挿入が失敗した場合です。 –

関連する問題