3 回答

TA貢獻(xiàn)1772條經(jīng)驗 獲得超5個贊
主要有兩種交易方式; 連接事務(wù)和環(huán)境事務(wù)。連接事務(wù)(例如SqlTransaction)直接綁定到數(shù)據(jù)庫連接(例如SqlConnection),這意味著您必須繼續(xù)傳遞連接 - 在某些情況下確定,但不允許“創(chuàng)建/使用/發(fā)布”用法,并且不允許跨數(shù)據(jù)庫工作。一個例子(格式化為空格):
using (IDbTransaction tran = conn.BeginTransaction()) { try { // your code tran.Commit(); } catch { tran.Rollback(); throw; }}
不太亂,但僅限于我們的連接“conn”。如果我們想要調(diào)用不同的方法,我們現(xiàn)在需要傳遞“conn”。
另一種選擇是環(huán)境交易; 在.NET 2.0中,TransactionScope對象(System.Transactions.dll)允許在一系列操作中使用(合適的提供者將自動登記在環(huán)境事務(wù)中)。這使得可以輕松地改編為現(xiàn)有(非事務(wù)性)代碼,并與多個提供者交談(盡管如果您與多個提供者交談,DTC將參與其中)。
例如:
using(TransactionScope tran = new TransactionScope()) { CallAMethodThatDoesSomeWork(); CallAMethodThatDoesSomeMoreWork(); tran.Complete();}
請注意,這兩個方法可以處理它們自己的連接(open / use / close / dispose),但它們將默默地成為環(huán)境事務(wù)的一部分,而我們不必傳遞任何內(nèi)容。
如果您的代碼出錯,Dispose()將在沒有Complete()的情況下被調(diào)用,因此它將被回滾。雖然您無法回滾內(nèi)部事務(wù)但完成外部事務(wù),但支持預(yù)期的嵌套等:如果任何人不滿意,則事務(wù)將中止。
TransactionScope的另一個優(yōu)點是它不僅僅與數(shù)據(jù)庫綁定; 任何支持事務(wù)的提供者都可以使用它。例如,WCF?;蛘呱踔劣幸恍┡cTransactionScope兼容的對象模型(即具有回滾功能的.NET類 - 可能比紀(jì)念品更容易,盡管我自己從未使用過這種方法)。
總而言之,這是一個非常非常有用的對象。
一些警告:
在SQL Server 2000上,TransactionScope將立即轉(zhuǎn)到DTC; 這是在SQL Server 2005及更高版本中修復(fù)的,它可以使用LTM(更少的開銷),直到你與2個源等交談,當(dāng)它被提升到DTC時。
有一個小故障意味著您可能需要調(diào)整連接字符串

TA貢獻(xiàn)1775條經(jīng)驗 獲得超8個贊
protected void Button1_Click(object sender, EventArgs e) { using (SqlConnection connection1 = new SqlConnection("Data Source=.\\SQLEXPRESS;AttachDbFilename=|DataDirectory|\\Database.mdf;Integrated Security=True;User Instance=True")) { connection1.Open(); // Start a local transaction. SqlTransaction sqlTran = connection1.BeginTransaction(); // Enlist a command in the current transaction. SqlCommand command = connection1.CreateCommand(); command.Transaction = sqlTran; try { // Execute two separate commands. command.CommandText = "insert into [doctor](drname,drspecialization,drday) values ('a','b','c')"; command.ExecuteNonQuery(); command.CommandText = "insert into [doctor](drname,drspecialization,drday) values ('x','y','z')"; command.ExecuteNonQuery(); // Commit the transaction. sqlTran.Commit(); Label3.Text = "Both records were written to database."; } catch (Exception ex) { // Handle the exception if the transaction fails to commit. Label4.Text = ex.Message; try { // Attempt to roll back the transaction. sqlTran.Rollback(); } catch (Exception exRollback) { // Throws an InvalidOperationException if the connection // is closed or the transaction has already been rolled // back on the server. Label5.Text = exRollback.Message; } } } }
- 3 回答
- 0 關(guān)注
- 480 瀏覽
添加回答
舉報