事務有很多種,看了一些關於事務的問題,這里做下筆記·····
事務時單個的工作單位。如果某一事務成功,則在該事務中進行的所有數據更改均會提交,成為數據庫中永久的組成部分。若果事務遇到錯誤,則必須取消或回滾,所有數據均被更改清除。
屬性:
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中的數據庫操作也回滾。