分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 技术分享

net中的4种事务总结

发布时间:2023-09-06 01:27责任编辑:傅花花关键词:暂无标签

在一个MIS系统中,没有用事务那就绝对是有问题的,要么就只有一种情况:你的系统实在是太小了,业务业务逻辑有只要一步执行就可以完成了。因此掌握事务处理的方法是很重要,进我的归类在.net中大致有以下4种事务处理的方法。大家可以参考一下,根据实际选择适当的事务处理。

CREATEPROCEDUREdbo.SPTransaction
(
@UpdateIDint,
@UpdateValuenchar(50),
@InsertIDint,
@InsertValuenchar(50)
)
AS
beginTran
UpdateRegionSetRegionDescription=@UpdateValuewhereRegionID=@UpdateID

insertintoRegionValues(@InsertID,@InsertValue)

declare@RegionErrorint
select@RegionError=@@error
if(@RegionError=0)
COMMITTran
else
ROLLBACKTran
GO

执行带事务的存储过程



///<summary>
///一般的ADO.net事务
///</summary>
publicvoidADONetTran1()
{
SqlConnectionconn=newSqlConnection("DataSource=127.0.0.1;InitialCatalog=Northwind;PersistSecurityInfo=True;UserID=sa;Password=123;");
SqlCommandcmd=newSqlCommand();
try
{
cmd.CommandText="UpdateRegionSetRegionDescription=@UpdateValuewhereRegionID=@UpdateID";
cmd.CommandType=CommandType.Text;
cmd.Connection=conn;
conn.Open();
SqlParameter[]paras=newSqlParameter[]{
newSqlParameter("@UpdateID",SqlDbType.Int,32),
newSqlParameter("@UpdateValue",SqlDbType.NChar,50)};
paras[0].Value="2";
paras[1].Value="UpdateValue12";

foreach(SqlParameterparainparas)
{
cmd.Parameters.Add(para);
}
//开始事务
cmd.Transaction=conn.BeginTransaction();
cmd.ExecuteNonQuery();


cmd.CommandText="insertintoRegionvalues(@InsertID,@InsertValue)";
cmd.CommandType=CommandType.Text;

paras=newSqlParameter[]{
newSqlParameter("@InsertID",SqlDbType.Int,32),
newSqlParameter("@InsertValue",SqlDbType.NChar,50)};
paras[0].Value="7";
paras[1].Value="InsertValue";

cmd.Parameters.Clear();
foreach(SqlParameterparainparas)
{
cmd.Parameters.Add(para);
}

cmd.ExecuteNonQuery();
//提交事务
cmd.Transaction.Commit();
}
catch
{
//回滚事务
cmd.Transaction.Rollback();
throw;
}
finally
{
conn.Close();
}

}

3 TransactionScope事务
TransactionScope事务类,它可以使代码块成为事务性代码。并自动提升为分布式事务

///<summary>
///TransactionScope事务:可自动提升事务为完全分布式事务的轻型(本地)事务。
///使用时要保证MSDTC服务(控制分布事务)是开启的可以使用:netstartmsdtc命令开启服务;
///</summary>
publicvoidADONetTran2()
{
SqlConnectionconn=newSqlConnection("DataSource=127.0.0.1;InitialCatalog=Northwind;PersistSecurityInfo=True;UserID=sa;Password=123;");
SqlCommandcmd=newSqlCommand();
try
{

using(System.Transactions.TransactionScopets=newTransactionScope())
{

cmd.CommandText="UpdateRegionSetRegionDescription=@UpdateValuewhereRegionID=@UpdateID";
cmd.CommandType=CommandType.Text;
cmd.Connection=conn;
conn.Open();
SqlParameter[]paras=newSqlParameter[]{
newSqlParameter("@UpdateID",SqlDbType.Int,32),
newSqlParameter("@UpdateValue",SqlDbType.NChar,50)};
paras[0].Value="2";
paras[1].Value="UpdateValue12";

foreach(SqlParameterparainparas)
{
cmd.Parameters.Add(para);
}
cmd.ExecuteNonQuery();


cmd.CommandText="insertintoRegionvalues(@InsertID,@InsertValue)";
cmd.CommandType=CommandType.Text;

paras=newSqlParameter[]{
newSqlParameter("@InsertID",SqlDbType.Int,32),
newSqlParameter("@InsertValue",SqlDbType.NChar,50)};
paras[0].Value="8";
paras[1].Value="InsertValue";

cmd.Parameters.Clear();
foreach(SqlParameterparainparas)
{
cmd.Parameters.Add(para);
}

cmd.ExecuteNonQuery();
//提交事务
ts.Complete();
}
}
catch
{
throw;
}
finally
{
conn.Close();
}

}

4 COM+事务
在分布式应用程序中,往往要同时操作多个数据库,使用数据库事务就不能满足业务的要求了。在COM+中,提供完整的事务处理服务。很方便处理多个数据库上的事务。

///<summary>
///COM+事务
///</summary>
publicvoidComTran()
{
SqlConnectionconn=newSqlConnection("DataSource=127.0.0.1;InitialCatalog=Northwind;PersistSecurityInfo=True;UserID=sa;Password=123;");
SqlCommandcmd=newSqlCommand();
ServiceConfigsc=newServiceConfig();

//指定事务类型
sc.Transaction=TransactionOption.Required;
//设置启动跟踪
sc.TrackingEnabled=true;
//创建一个上下文,该上下文的配置由作为cfg参数传递的ServiceConfig对象来指定。
//随后,客户端和服务器端的策略均被触发,如同发生了一个方法调用。
//接着,新的上下文被推至上下文堆栈,成为当前上下文
ServiceDomain.Enter(sc);
try
{
cmd.CommandText="UpdateRegionSetRegionDescription=@UpdateValuewhereRegionID=@UpdateID";
cmd.CommandType=CommandType.Text;
cmd.Connection=conn;
conn.Open();
SqlParameter[]paras=newSqlParameter[]{
newSqlParameter("@UpdateID",SqlDbType.Int,32),
newSqlParameter("@UpdateValue",SqlDbType.NChar,50)};
paras[0].Value="2";
paras[1].Value="UpdateValue22";

foreach(SqlParameterparainparas)
{
cmd.Parameters.Add(para);
}
cmd.ExecuteNonQuery();


cmd.CommandText="insertintoRegionvalues(@InsertID,@InsertValue)";
cmd.CommandType=CommandType.Text;

paras=newSqlParameter[]{
newSqlParameter("@InsertID",SqlDbType.Int,32),
newSqlParameter("@InsertValue",SqlDbType.NChar,50)};
paras[0].Value="9";
paras[1].Value="InsertValue";

cmd.Parameters.Clear();
foreach(SqlParameterparainparas)
{
cmd.Parameters.Add(para);
}

cmd.ExecuteNonQuery();

//提交事务
ContextUtil.SetComplete();
}
catch
{
//回滚事务
ContextUtil.SetAbort();
throw;
}
finally
{
conn.Close();
//触发服务器端的策略,随后触发客户端的策略,如同一个方法调用正在返回。
//然后,当前上下文被弹出上下文堆栈,调用Enter时正在运行的上下文成为当前的上下文。
ServiceDomain.Leave();
}

}

另外,必须注意的一点就是事务的默认行为。在默认情况下,如果没有显式的提交事务,则事务会回滚。虽然默认行为允许事务的回滚,但是显式回滚方法总是一个良好的编程习惯。这不仅仅只是释放锁定数据,也将使得代码更容易读并且更少错误。

net中的4种事务总结

原文地址:http://www.cnblogs.com/lgx5/p/7899929.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved