您的位置:首页 > 编程语言 > ASP

ASP.NET 3.5(C#)系列3-新一代事务机制

2011-02-13 04:13 405 查看
事物这个概念已经接触过。在旧的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时机时,才用显示事务。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐