1.隐式事务(TransactionScope)
超出事务范围时 如果没有手动调用Complete()方法,则不会提交事务
string strConn = "server=.;uid=sa;pwd=123;database=db_test;"; string strSql = "insert into user_info (name,tel) values ('ee',13590305258)"; using (TransactionScope tran = new TransactionScope()) { using (SqlConnection conn = new SqlConnection(strConn)) { conn.Open(); SqlCommand cmd = new SqlCommand(strSql, conn); cmd.CommandType = CommandType.Text; int result = cmd.ExecuteNonQuery(); if (result == 1) { Console.WriteLine("数据添加成功..."); } conn.Close(); } Console.WriteLine("请输入1或0 1提交事务;0回滚事务...."); int key = Convert.ToInt32(Console.ReadLine()); if (key == 0) { //回滚当前环境中正在运行的事务 //System.Transactions.Transaction.Current.Rollback(); Console.WriteLine("回滚事务完毕..."); } else { tran.Complete(); //超出事务范围时 如果没有手动调用Complete()方法,则不会提交事务 Console.WriteLine("提交事务完毕..."); } }
2.显式事务
创建 CommittableTransaction 的实例并不会自动设置环境事务上下文。因此,资源管理器上的任何操作都不属于该事务。全局 Transaction 对象上的静态 Current 属性用于设置或检索环境事务,应用程序必须手动设置该属性,才能确保资源管理器可参与事务
string strConn = "server=.;uid=sa;pwd=123;database=db_test;"; string strSql = "insert into user_info (name,tel) values ('ee',13590305258)"; CommittableTransaction tran = new CommittableTransaction(); using (SqlConnection conn = new SqlConnection(strConn)) { conn.Open(); conn.EnlistTransaction(tran); //需要把事务添加到当前环境中.... SqlCommand cmd = new SqlCommand(strSql, conn); cmd.CommandType = CommandType.Text; int result = cmd.ExecuteNonQuery(); if (result == 1) { Console.WriteLine("数据添加成功..."); } conn.Close(); } Console.WriteLine("请输入1或0 1提交事务;0回滚事务...."); int key = Convert.ToInt32(Console.ReadLine()); if (key == 0) { tran.Rollback(); Console.WriteLine("回滚事务完毕..."); } else { tran.Commit(); Console.WriteLine("提交事务完毕..."); }