TransactionScope雖然在概念上很簡單,但在幕後隱藏了許多魔力。它使您能夠使用分佈在多臺機器上的一個事務。爲此,它需要來自數據庫的複雜支持 - 而且開銷可能很高,也可能不高。
一個更簡單更有限的技術產品,並可滿足您:DbTransaction。您的Db提供程序可以使用類似於sql的BEGIN TRANSACTION
和COMMIT TRANSACTION
的語義實現一個事務:簡而言之,該事務僅跨單個計算機上的單個連接。
你的代碼會看起來像......
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,但它並不是非常有問題。