TransactionScopeは概念的にシンプルですが、背後には多くの魔法が隠れています。これにより、複数のマシンに分散された1つのトランザクションを使用できます。これを行うには、データベースからの複雑なサポートが必要です。また、オーバーヘッドが高い場合とそうでない場合があります。
DbTransactionでは、より単純な、より限定された技術で十分です。あなたのDbプロバイダは、SQLのBEGIN TRANSACTION
とCOMMIT TRANSACTION
に類似したセマンティクスを持つトランザクションを実装できます。つまり、1台のマシン上で1つの接続にまたがるトランザクションです。その後、次のようになります
あなたのコード...
DbCommand cmd = ...;
using (DbTransaction trans = Connection.BeginTransaction()) {
cmd.Transaction = trans; //sometimes optional, though MS-SQL requires it.
cmd.ExecuteNonQuery()
[...other db commands with the same connection and transaction...]
trans.Commit();
}
であるためには、クリスタルクリア:トランザクションが開いているときに、いくつかの他の接続を使用することができます - しかし、それらの間にはリンクがありません。異なる接続で実行されたコマンドは、トランザクションの中止時にロールバックされません(任意のC#コードは、トランザクションの中断時にロールバックされないように)。
このアプローチは、より軽量で細かく、より広範なデータベースプロバイダで動作し、MSDTCを起動する必要はありません。反面、トランザクションは接続に固有です(複数の接続がある場合はトランザクションを共有しません)、分散することはできず、トランザクションに手動でコマンドを登録する必要があります(少なくともMSの場合-SQL)。
注:トランザクションにコマンドを登録しなかった場合、MS-SQLは例外をスローしますが、SQLiteは暗黙的にコマンドを登録します。すべてのコマンドはにする必要がありますので、これはトランザクションに登録する必要があります。これは単なる冗長なAPIですが、それほど問題はありません。