6

特に重要な Web サービスで、 MySQLセーブポイントを (直接または ORM 経由で)使用して共有できる経験がある人はいますか? 実際にどこで使ったことがありますか?それらは十分に信頼できますか (かなり最近のバージョンの MySQL を実行する意思があると仮定して)、それとも最先端または高価すぎますか?

最後に、次のユースケースのような経験をしたことがある人はいますか?そのためにセーブポイントを使用しましたか? ある特定の作業単位の主なポイントが、同じトランザクションでテーブルに行を追加しOrders(もちろん、順序に関連する必要はありません)、テーブルを更新することであるとします。可能な限り更新するOrdersAuditInfoことは不可欠ですが、テーブルはそれほど重要ではありません (たとえば、エラーをファイルに記録するだけで問題ありませんが、トランザクション全体を続行できます)。低レベルでは、次のようになります (警告、疑似 SQL が続きます)。OrdersOrdersAuditInfo

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;

しかし、ここでも、より良い (または少なくともより一般的な) イディオムがあるのではないでしょうか? まったく別のトランザクションで挿入を行うこともできますが、最終的に実際に機能しない限り、テーブルに書き込まれないOrdersAuditInfoことが保証されているとよいでしょう。OrdersAuditInfoCOMMIT

4

2 に答える 2

1

コードの理解と検証が非常に難しくなる可能性があるため、私は通常、SAVEPOINT を避ける傾向があります。

投稿した場合、単一のトランザクションでラップするかどうかは、 とOrdersAudit正確に一致するレコードを持つことOrdersがビジネス ルールの一部であるかどうかによって異なります。

編集: 質問をもう一度読んでください。OrdersAuditとの間の対応を保証する必要はありませんOrdersOrdersAuditしたがって、レコードの挿入にトランザクションは使用しません。

于 2009-03-03T06:34:00.673 に答える