誰も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
が処理されない限り、がに書き込まれていないことが保証されてうれしいです。
OrdersAuditをトランザクション全体の一部にしたい理由は、何らかの理由でCOMMIT時間にOrdersへの挿入が失敗した場合です。 –