c#傳統SqlTransaction事務和TransactionScope事務


事務有很多種,看了一些關於事務的問題,這里做下筆記·····

事務時單個的工作單位。如果某一事務成功,則在該事務中進行的所有數據更改均會提交,成為數據庫中永久的組成部分。若果事務遇到錯誤,則必須取消或回滾,所有數據均被更改清除。

屬性:

1.原子性:事務是一個完整的操作,事務的各元素師不可分的。

2.一致性:事務開始時和完成時,數據必須處於一致的狀態。

3.隔離性:對數據進行修改的所有並發事務是彼此隔離的。

4.持久性:事務完成后,它對系統的影響是永久的。

1.連接相關SqlTransaction事務

Transact-SQL使用下列語句來管理事務:

開始事務:BEGIN TRANSACTION

提交事務:COMMIT TRANSACTION

回滾:ROLLBACK TRANSACTION

private static void ExecuteSqlTransaction(string connstr)
        {
            using (SqlConnection conn = new SqlConnection(connstr))
            {
                conn.Open();               
                using (SqlCommand cmd = conn.CreateCommand())
                {
                    SqlTransaction transaction = conn.BeginTransaction("SampleTransaction"); //開始事務
                    cmd.Connection = conn;
                    cmd.Transaction = transaction;
                    try
                    {
                        cmd.CommandText =
                            "Insert into Department (ID, Name) VALUES (2, '開發部')";
                        cmd.ExecuteNonQuery();
                        cmd.CommandText =
                            "Insert into Users(ID, Name,DepartmentID) VALUES (2, 'sxw',2)";
                        cmd.ExecuteNonQuery();
                        transaction.Commit(); //事務完成之后提交事務
                    }
                    catch (Exception ex)
                    {
                        transaction.Rollback(); //如果事務沒有完成,就回滾事務
                    }
                }                               
            }
        }

注意:在提交或回滾 SqlTransaction 時,應始終使用 Try/Catch 進行異常處理。如果連接終止或事務已在服務器上回滾,則Commit 和Rollback 都會生成InvalidOperationException

 

雖然SqlTransaction事務應用很廣泛,但SqlTransaction事務也有自己的缺點,就是不能實現分布式事務、嵌套事務、編寫也麻煩。下面介紹能實現分布式事務的方法,編程相對來說還是很方便的

2.TransactionScope實現分布式事務

想在編程中使用TransactionScope實現分布式事務,

首先要在電腦服務中啟動MSDTC(Distributed Transaction Coordinator)服務····

注意:MSDTC服務只要把數據交互的電腦上的此服務打開就可以,如果是客戶端直接訪問服務器,則客戶端和服務器的MSDTC服務都要打開,

如果客戶端只是與中間層交互,中間層才與服務器數據交互,則客戶端的MSDTC服務可以不用打開,但中間層和服務器的MSDTC服務必須啟動。

在第一次啟動MSDTC服務時,服務的啟動類型都是手動啟動,這是可以把啟動類型改成自動啟動,這樣下次就不需要自己手動啟動了

其次需要在項目中添加對System.Transactions的引用

最后就可以在代碼中引用TransactionScope的Complete方法。進行事務操作。

//使用事務保證原子性
            using (TransactionScope ts = new TransactionScope())
            {
                SqlHelp.ExecuteNonQuery("Insert into Department (ID, Name) VALUES (@Id, '開發部')",
                new SqlParameter("@Id", Id));
                SqlHelp.ExecuteNonQuery("Insert into Users(ID, Name,DepartmentID) VALUES (@Id, 'sxw',2)",
                    new SqlParameter("@Id", Id));
                ts.Complete(); //完成事務,這個必須加上,要不然事務不會有效
            }

TransactionScope也可以實現嵌套式事務,也就是A調用B,B中聲明了TransactionScope事務,A中也聲明了,這樣如果B沒錯,但是A調完B后出錯,則B中的數據庫操作也回滾。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM