事务处理.docx
《事务处理.docx》由会员分享,可在线阅读,更多相关《事务处理.docx(7页珍藏版)》请在冰豆网上搜索。
![事务处理.docx](https://file1.bdocx.com/fileroot1/2022-11/23/f7f0ef9e-f492-4b5c-9c82-805916e2752e/f7f0ef9e-f492-4b5c-9c82-805916e2752e1.gif)
事务处理
3..NET2.0中的事务
通过登记正在执行的事务性工作类型的资源管理器,.NETFramework2.0中的事务管理系统能够解决动态事务组合而导致的额外开销问题。
它还提供了将多个不稳定资源转换为提交和回滚事务模型所需的架构。
在下面的内容中将介绍.NET2.0中与事务有关的轻量级事务管理、显式事务、TransactionScope类和自动化事务。
轻量级事务管理
对于发生在单个应用程序域中的事务,LTM是一种运行很快,非常便宜的资源管理器。
LTM是框架中所有事务的起点,同时监视正在与事务交互的资源,以及根据需要登记更多健壮的事务管理器的服务。
当事务性工作在进程外工作(例如开始修改数据库数据)时,LTM将自动使用支持可升级的单阶段登记(PSPE)的资源管理器模型。
这是一种新的事务性架构,其理解LTM的“预付费”机制。
如果没有可用的PSPE管理器,那么LTM会登记DTC。
当然,多个远程数据源将被登记的DTC修改。
当PSPE模型开始工作时,事务的执行将于ADO.NET1.x的事务一致。
读者可能会怀疑PSPE具有与ADO.NET事务一样的性能。
当与多个数据库交互时,事务将自动提升到DTC。
在.NETFramework2.0中,使用SQLServer2005时将自动获得PSPE事务。
如果事务性工作与另一个服务器或者数据库交互,那么自动使用DTC。
易失性事务自动参与PSPE,而不用调用DTC。
实现显式事务
有时候,TransactionScope对象的默认隐式自动事务功能可能无法提供所需较好的控制级别。
在这种情况下,可能需要人工创建事务,同时显式提交或者回滚事务。
示例1显示使用CommittableTransaction类创建显式事务包括的步骤。
例1:
使用CommittableTransaction实现显式事务
<%@PageLanguage="C#"%>
<%@ImportNamespace="System.Data"%>
<%@ImportNamespace="System.Data.SqlClient"%>
<%@ImportNamespace="System.Transactions"%>
<%@ImportNamespace="System.Web.Configuration"%>
voidbtnSave_Click(objectsender,EventArgse)
{
CommittableTransactiontrans=newCommittableTransaction();
try
{
stringconnectionString=WebConfigurationManager.ConnectionStrings
["Mydatabase"].ConnectionString;
using(SqlConnectionconnection=newSqlConnection(connectionString))
{
stringsql="InsertintoProduction.ProductCategory(Name,"+
"rowguid,ModifiedDate)Values(@Name,@rowguid,@ModifiedDate)";
//打开连接,在事务范围中登记此连接
connection.Open();
SqlCommandcommand=newSqlCommand(sql,connection);
command.CommandType=CommandType.Text;
SqlParameternameParam=
newSqlParameter("@Name",SqlDbType.NVarChar,50);
nameParam.Value=txtCategoryName.Text;
command.Parameters.Add(nameParam);
SqlParameterguidParam=newSqlParameter("@rowguid",
SqlDbType.UniqueIdentifier);
guidParam.Value=System.Guid.NewGuid();
command.Parameters.Add(guidParam);
SqlParametermodifieDateParam=newSqlParameter("@ModifiedDate",
SqlDbType.DateTime);
modifieDateParam.Value=System.DateTime.Now;
command.Parameters.Add(modifieDateParam);
//在当前事务的范围中登记事务
connection.EnlistTransaction(trans);
command.ExecuteNonQuery();
//如果每一个执行都成功,则提交事务
trans.Commit();
}
lblResult.Text="Categoryiswrittensuccessfully";
}
catch(Exceptionex)
{
//如果出现异常,则回滚事务
trans.Rollback();
lblResult.Text="Exceptionis:
"+ex.Message;
}
}
//www.w3.org/1999/xhtml">
UsingExplicitTransactionsusingCommittableTransaction
LabelID="lblCategoryName"runat="server"
Text="CategoryName:
"Width="179px">
Label>
TextBoxID="txtCategoryName"runat="server"/>
ButtonID="btnSave"runat="server"Text="Save"Width="92px"
OnClick="btnSave_Click"/>
LabelID="lblResult"runat="server"Font-Bold="true"
Font-Size="Small"/>