自动事务和 ASP.NET
在 ASP.NET 页中插入事务指令,您可以指示该页参与现有事务、开始新事务或永不参与事务。
下表列出并描述 ASP.NET 中可用的事务指令。
Disabled指示 ASP.NET 将忽略事务上下文。这是默认的事务状态。NotSupported指示该页不在事务范围内运行。处理请求后,不管是否有活动事务,均在没有事务的情况下创建其对象上下文。Supported指示该页在现有事务的上下文中运行。如果没有事务,则该页在没有事务的情况下运行。Required该页在现有事务的上下文中运行。如果没有事务,则该页将启动一个事务。RequiresNew指示该页需要事务且为每个请求启动新事务。<%@ Page Transaction="Required" %>
自动事务和 XML Web services
可使用 WebMethodAttribute 属性类的 TransactionOption 属性声明一个自动事务。
[ WebMethod(TransactionOption=TransactionOption.RequiresNew)]
public int DeleteAuthor(string lastName)
{
String deleteCmd = "DELETE FROM authors2 where au_lname='" + lastName + "'" ;
SqlConnection sqlConn = new SqlConnection("Integrated Security=SSPI;database=pubs;server=myserver");
SqlCommand myCommand = new SqlCommand(deleteCmd,sqlConn);
myCommand.Connection.Open();
return myCommand.ExecuteNonQuery();
}
自动事务中的投票
.NET Framework 类和 ASP.NET 页可以通过投票来提交或中止它们的当前事务。默认情况下,如果代码中没有显式投票,则默认为赞成提交。但默认提交可能会延长为每个事务释放昂贵资源所用的时间,从而可能降低应用程序的性能。
显式投票还允许类或页在遇到严重错误时中止事务。
使用自动完成
System.EnterpriseServices.AutoCompleteAttribute 使参与事务的对象投票赞成在方法正常返回时完成事务。如果方法调用引发异常,则中止事务。只能将此特性应用于从 ServicedComponent 类派生的类。
[Transaction(TransactionOption.Supported)]
public class Account : ServicedComponent {
[AutoComplete]
public void Debit(int amount) {
// Do some database work. Any exception thrown here aborts the transaction;
// otherwise, transaction commits.
}
}
使用 SetAbort 和 SetComplete
可以使用公开 SetComplete 或 SetAbort 方法的 System.EnterpriseServices.ContextUtil 类来显式提交或中止事务。SetComplete 指示对象投票赞成提交其工作;SetAbort 指示对象遇到了问题且投票赞成中止正在进行的事务。直到事务的根对象停用,才提交或中止事务。此外,任何参与事务的对象中有一个中止投票,都将导致整个事务失败。
if( !DoSomeWork() )
{
//Something goes wrong.
ContextUtil.SetAbort();
}
else
{
//All goes well.
ContextUtil.SetComplete();
}