事物这个概念已经接触过。在旧的ADO.NET事务机制中,我们需要这样做:
SqlConnection conn = new SqlConnection(); conn.Open(); SqlTransaction tran = conn.BeginTransaction(); //显示声明开始建立事物Transaction string sqlString ="xxxxxx"; SqlCommand cmd = new SqlCommand(sqlString, conn, tran); //建立SqlCommand,并引入Transaction try { cmd.ExecuteNonQuery(); tran.Commit(); //成功,事物结束 } catch { tran.Rollback(); //有错误,事物回滚 }
1:显示声明一个SqlTransaction对象。
2:在SqlConnection中调用SqlTransaction对象。
3:在SqlCommand中使用SqlTransaction对象。
4:结束后显示进行Commit()或者RollBack()操作。
这种方式的优点:简单,速度快
这种方式的缺点:只能管理单一的SqlConnection对象和单一事务管理。对多个SqlConnection和分布式事务无能为力。
在新的ASP.NET3.5事务机制中,依然沿用了2.0的System.Transaction命名空间,只是更强大。
System.Transaction中有两大类:
1.隐式事务编写
TransactionScope类;
2.显示事务编写
Transaction类;
CommittableTransaction类;
1)什么是隐式事务?
答:隐式事务是SQL Server为你而做的事务.隐式事务又称自动提交事务。
隐式事务使用TransactionScope类,编写方便简单,所以优先考虑,若不行,再用显示事务编写。
用法:首先在项目中加入System.Transactions组件(在项目中添加引用),然后在程序中引用 using System.Transactions 命名空间,这样才能访问事务相关功能。语法如下:
//声明TransactionScope隐式事务 using (TransactionScope Ts = new TransactionScope()) { //ADO.NET程序 Ts.Complete(); }
例:将刚才的例子用TransactionScope类重写
string connString = "xxxx"; SqlConnection conn = new SqlConnection(connString); string sqlString = "xxxxxx"; SqlCommand cmd = new SqlCommand(sqlString, conn); using (TransactionScope Ts = new TransactionScope()) //将TransactionScope类建立在一个using块内 { conn.Open(); //所有ADO.NET操作放在using块中 try { cmd.ExecuteNonQuery(); Ts.Complete(); //显示说明事务完成 } catch (Exception ex) { Response.Write(ex.Message); //不用显示声明,发生错误自动进行回滚操作 } finally { conn.Close(); } }
2)什么是显示事务?
答:显示事务是一种由你自己指定的事务.这种事务允许你自己决定哪批工作必须成功完成,否则所有部分都不完成。显示事务必须明确指出Begin(开始),Commit(确认事务结束),Rollback(错误回滚操作)。
显示事务用CommittableTransaction类,他继承自Transaction类。语法如下:
using (CommittableTransaction tran = new CommittableTransaction()) //将CommittableTransaction类建立在一个using块中 { conn.Open(); //所有ADO.NET操作放在using块中 conn.EnlistTransaction(tran); //显示加入事务 try { //ADO.NET操作 tran.Commit(); //确认事务完成 } catch { tran.Rollback(); //事务回滚操作 } }
例:将刚才的例子用CommittableTransaction类重写
using (CommittableTransaction tran = new CommittableTransaction()) { conn.Open(); conn.EnlistTransaction(tran); //加入显示事务 try { //ADO.NET操作; tran.Commit(); //确认事务完成 } catch { tran.Rollback(); //事务回滚操作 } }
这个例子中Sqlconnection的EnlistTransaction方法非常重要,少了它事务将不会发生正常作用。
3)到底选择哪种事务机制?
答:优先选择隐式事务,因为快速方便,且并不需要进行太多的事务应用。当有特定需求,如需要自行决定Commit或Rollback时机时,才用显示事务。