4

Railsはセーブポイントを使用してMySQLでネストされたトランザクションを実現します。私の理解では、これのセマンティクスは、アトミックデータの変更に関して、実際のネストされたトランザクションと同じです。

  1. これは本当ですか?
  2. コード内の任意の時間に「保存」を呼び出すのはどうですか?トランザクションは、ブロックが終了するまで開いたままですよね?ネストされたトランザクション/セーブポイントを使用する場合の動作に違いはありますか?
  3. 他に知っておくべきことはありますか?
  4. [意図的に炎上戦争を扇動する]PostgresSQLに切り替える必要がありますか?
4

2 に答える 2

4
  1. はい、これは本当です。真にネストされたトランザクションを持つ唯一の DB は MS SQL Server です

  2. はい、任意の時点で save を呼び出してもトランザクションは開いたままですが、ネストされたトランザクション内でロールバック例外が発生した場合、外側のトランザクションのグローバル ロールバックは発生しません (セーブポイント管理については #3 も参照してください)。

  3. Model.transaction(:requires_new => true) を渡してサブトランザクションを作成することができます。これはおそらく期待どおりの動作です。そうしないと、ネストされたロールバックに従わないため、ネストされたトランザクションを制御できなくなります。また、モデルのコールバックはすべて 1 つのトランザクションで実行されるため、コールバック内のトランザクションはネストされたトランザクションであることを忘れている人もいます。

  4. あなたは本当に炎上戦争を扇動しているわけではありません.PostgresSQLにはネストされたトランザクションもありません(セーブポイントも使用します).どちらも優れたデータベースです.

于 2011-03-10T04:47:25.997 に答える
1

私の知る限り、Mysqlのネストされたトランザクションは、MySQL5以降のセーブポイント機能に依存しています。Rails2.3.2+およびMysql5+の場合は、正しく機能するはずです。

ただし、ネストされたトランザクションの管理は非常に面倒な場合があります。これに依存して実行中の作業をクリーンアップし、ワークフローをより単純なもの(IMHO)に分解する場合は、設計の選択を検討することをお勧めします。

于 2011-02-21T19:25:50.913 に答える