事物(Transaction)是訪問並可能更新數據庫中各種數據項的一個程序執行單元(unit)。事物通常由高級數據庫操縱語言或編程語言(如SQL,C++或Java)書寫的用戶程序的執行所引起,並用形如begin transaction和commit transaction
或 rollback transaction語句(或回調函數)來界定。事物由事務開始(begin transaction)和事務結束(committransaction或 rollback transaction)之間執行的全體操作組成。SQL Server中事務語句開始或結束時transaction可簡寫為tran.
事物應該具有4個屬性:原子性、一致性、隔離性、持續性。這四個屬性通常稱為ACID特性.
原子性(atomicity): 一個事務是一個不可分割的工作單位,事務中包括的諸操作要麼都做,要麼都不做。
一致性(consistency): 事物必須是使數據庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。
隔離性(isolation): 一個事物的執行不能被其他事務干擾。即一個事物內部的操作及使用的數據對並發的其他事務是隔離的,並發執行的各個事務之間不能互相干擾。
持久性(durability): 持續性也稱永久性(permanence),指一個事物一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。
啟動服務
Distributed Transaction Coordinator(TrkWks)
添加引用
System.Transactions
引入命名空間
using System.Transactions;
編寫代碼
static void Main(string[] args) { //分布式事務(原子性,要麼全部成功,要麼全部失敗(回滾 →sql完成)) using (TransactionScope ts = new TransactionScope()) { //第一步 string sql = "select top 1 loginId from dbo.sys_user where pwd=@pwd;"; SqlParameter[] param = { new SqlParameter("@pwd", System.Data.SqlDbType.VarChar,16) { Value = "12" } }; Console.WriteLine(SqlHelper.ExecuteScalar(sql, param).ToString()); //第二步 string _sql = "select top 1 loginId from dbo.sys_user where pwd=@pwd;"; SqlParameter[] _param = { new SqlParameter("@pwd", System.Data.SqlDbType.VarChar,16) { Value = "1" } }; Console.WriteLine(SqlHelper.ExecuteScalar(_sql, _param).ToString()); //完成 ts.Complete(); } Console.ReadKey(); } static void Main(string[] args) { //分布式事務(原子性,要麼全部成功,要麼全部失敗(回滾 →sql完成)) using (TransactionScope ts = new TransactionScope()) { //第一步 string sql = "select top 1 loginId from dbo.sys_user where pwd=@pwd;"; SqlParameter[] param = { new SqlParameter("@pwd", System.Data.SqlDbType.VarChar,16) { Value = "12" } }; Console.WriteLine(SqlHelper.ExecuteScalar(sql, param).ToString()); //第二步 string _sql = "select top 1 loginId from dbo.sys_user where pwd=@pwd;"; SqlParameter[] _param = { new SqlParameter("@pwd", System.Data.SqlDbType.VarChar,16) { Value = "1" } }; Console.WriteLine(SqlHelper.ExecuteScalar(_sql, _param).ToString()); //完成 ts.Complete(); } Console.ReadKey(); }
ts.Complete();事物完成 ts.Complete();事物完成