事务基本原理 ,可以通过使用Transaction类来利用显式编程模型,或者使用TransactionScope类来利用隐式编程模型,在该模型中通过基础结构自动管理事务。推荐采用隐式事务模型进行开发。事务的几种使用方式如下: namespace gaj.tools { /// <summary> /// 事务的基本原理: /// 多个任务绑定到一起,具有ACID属性(原子性,隔离性,永久性,一致性) /// 事务的隔离级别如果不指定,默认为IsolationLevel.Serializable,可以读取,不可以修改与添加 /// TransactionScope 隐式事务 /// CommittableTransaction 显式事务 /// </summary> public class TransactionDemo { //隐式事务 public void Example_TransactionScope() { using (TransactionScope ts = new TransactionScope(Transaction.Current)) { using (SqlConnection con = new SqlConnection()) { try { con.ConnectionString = "database=demo;server=.;uid=sa;pwd=123456;"; con.Open(); SqlCommand cmd = new SqlCommand("select * from master", con); SqlDataReader dr = cmd.ExecuteReader(); while (dr.Read()) { string name = dr["name"].ToString(); } } catch (Exception ex) { //log } } ts.Complete(); } } //显式事务:十分适合于想要跨多个函数调用或多个线程调用使用相同事务的应用程序 public void Example_CommittableTransaction() { Transaction trans = Transaction.Current;//获取环境事务 CommittableTransaction ct = new CommittableTransaction(); Transaction.Current = ct; try { ct.BeginCommit(OnCommit, null); } finally { Transaction.Current = trans;//设置环境变量 } } //回调函数:IAsyncResult参数是异步操作的结果 public void OnCommit(IAsyncResult iar) { CommittableTransaction ct = iar as CommittableTransaction; Debug.Assert(ct != null); using (ct) { ct.EndCommit(iar); } } //分布式事务 public void Example_DistributedTrans() { using (TransactionScope transScope = new TransactionScope()) { using (SqlConnection connection1 = new SqlConnection("connectString1")) { connection1.Open(); // Do work in the first connection. using (SqlConnection connection2 = new SqlConnection("connectString2")) { connection2.Open(); // Do work in the second connection. } } transScope.Complete(); } } //简单事务 public void Example_Trans() { using (SqlConnection con = new SqlConnection("connectString")) { con.Open(); SqlTransaction sqltrans = con.BeginTransaction(); SqlCommand cmd = con.CreateCommand(); cmd.Transaction = sqltrans; try { cmd.CommandText = "QueryString"; cmd.ExecuteNonQuery(); cmd.CommandText = "QueryString"; cmd.ExecuteNonQuery(); sqltrans.Commit(); } catch (SqlException ex) { sqltrans.Rollback(); } } } }