ASP.NET
事务可以说是在
.NET
平台上事务实现方式最简单的一种,你仅仅需要一行代码即可。在
aspx
的页面声明中加一个额外的属性,即事务属性
Transaction="Required"
,它有如下的值:
Disabled
(默认)、
NotSupported
、
Supported
、
Required
和
RequiresNew
,这些设置和
COM+
及企业级服务中的设置一样,典型的一个例子是如果你想在页面上下文中运行事务,那么要将其设置为
Required
。如果页面中包含有用户控件,那么这些控件也会包含到事务中,事务会存在于页面的每个地方。
代码示例:
页面声明
Transaction="Required"
:
<%@ Page Transaction="Required" Language="C#" AutoEventWireup="true"
CodeBehind="WebForm3.aspx.cs" Inherits="WebApplication4.WebForm3" %>
页面引用: using System.EnterpriseServices; 。
然后,数据操作代码:
protected void Button1_Click(object sender, EventArgs e)
{
try
{
Work1();
Work2();
ContextUtil.SetComplete(); // 提交事务
}
catch (System.Exception except)
{
ContextUtil.SetAbort(); // 撤销事务
Response.Write(except.Message);
}
}
private void Work1()
{
string conString = "data source=127.0.0.1;database=codematic;user id=sa;
password=";
SqlConnection myConnection = new SqlConnection(conString);
string strSql = "Insert Into P_Category(CategoryId,Name)values('1',
'test1')";
SqlCommand myCommand = new SqlCommand(strSql, myConnection);
myConnection.Open();
int rows = myCommand.ExecuteNonQuery();
myConnection.Close();
}
private void Work2()
{
string conString = "data source=127.0.0.1;database=codematic;user id=sa;
password=";
SqlConnection myConnection = new SqlConnection(conString);
string strSql = "Insert Into P_Category(CategoryId,Name)values('2',
'test2')";
SqlCommand myCommand = new SqlCommand(strSql, myConnection);
myConnection.Open();
int rows = myCommand.ExecuteNonQuery();
myConnection.Close();
}
ContextUtil 是用于获取
COM+
上下文信息的首选类。由于此类的成员全部为
static
,因此在使用其成员之前不需要对此类进行实例化。
ASP.NET 页面事务的优势和限制如下。
l 优势:实现简单,不需要额外的编码。
l限制:页面的所有代码都是同一个事务,这样的事务可能会很大,而也许我们需要的是分开的、小的事务实现在Web层。
选自 《亮剑.NET. .NET深入体验与实战精要》
一书 5.4 节。
代码示例:
<%@ Page
CodeBehind="WebForm3.aspx.cs" Inherits="WebApplication4.WebForm3"
页面引用: using System.EnterpriseServices;
然后,数据操作代码:
protected void Button1_Click(object sender, EventArgs e)
{
try
{
Work1();
Work2();
}
catch (System.Exception except)
{
Response.Write(except.Message);
}
}
private void Work1()
{
string conString = "data source=127.0.0.1;database=codematic;user id=sa;
password=";
SqlConnection myConnection = new SqlConnection(conString);
string strSql = "Insert Into P_Category(CategoryId,Name)values('1',
'test1')";
SqlCommand myCommand = new SqlCommand(strSql, myConnection);
myConnection.Open();
int rows = myCommand.ExecuteNonQuery();
myConnection.Close();
}
private void Work2()
{
string conString = "data source=127.0.0.1;database=codematic;user id=sa;
password=";
SqlConnection myConnection = new SqlConnection(conString);
string strSql = "Insert Into P_Category(CategoryId,Name)values('2',
'test2')";
SqlCommand myCommand = new SqlCommand(strSql, myConnection);
myConnection.Open();
int rows = myCommand.ExecuteNonQuery();
myConnection.Close();
}
ContextUtil
ASP.NET
l 优势:实现简单,不需要额外的编码。
l限制:页面的所有代码都是同一个事务,这样的事务可能会很大,而也许我们需要的是分开的、小的事务实现在Web层。
选自 《亮剑.NET. .NET深入体验与实战精要》