.net中事务的几种实现方式

//======================================================================
//方法1:直接写入到Sql脚本中
//优点:和数据库结合,运行效率高
//缺点:受到数据库的约束,如果要从sqlserver移植到其他数据库,可能要重写所有事物
//======================================================================
begin trans//开始事务
declare @orderDetailsError int , @productError ing
delete from "order details" where productId = 42
select @orderDetailsError = @@ERROR
delete from Products where productId = 42
select @productError = 0 and @productError = 0
commit trans//提交事务
else
rollback trans//回滚事务




//======================================================================
//方法2:使用Ado.net实现
//优点:不受数据库限制,
//缺点:对于一个事物要操作两个以上的数据库的跨数据库的操作的实现有一点困难。
//======================================================================
public void Exec_Jiaoyi( int customerId,string customer,int lastNum,int receiptId,string seller,string principal,DateTime bargainTime , decimal addMoney , string memo )
{
SqlConnection myConn = new SqlConnection( System.Configuration.ConfigurationSettings.AppSettings["connectionString"] ) ;
myConn.Open ( ) ;
SqlTransaction myTrans = myConn.BeginTransaction ( ) ;
SqlCommand myCommand=new SqlCommand ( );
myCommand.Connection = myConn ;
myCommand.Transaction = myTrans ;//开始事务
try
{
myCommand.Parameters.Add(new SqlParameter("@m_customerId", SqlDbType.Int,0)).Value=customerId;
myCommand.Parameters.Add(new SqlParameter("@m_customer", SqlDbType.NVarChar,100)).Value=customer;
myCommand.Parameters.Add(new SqlParameter("@m_lastNum", SqlDbType.Int,0)).Value=lastNum;
myCommand.Parameters.Add(new SqlParameter("@m_receiptId", SqlDbType.Int,0)).Value=receiptId;
myCommand.Parameters.Add(new SqlParameter("@m_seller", SqlDbType.NVarChar,100)).Value=seller;
myCommand.Parameters.Add(new SqlParameter("@m_principal", SqlDbType.NVarChar,100)).Value=principal;
myCommand.Parameters.Add(new SqlParameter("@m_bargainTime", SqlDbType.DateTime,0)).Value=bargainTime;
myCommand.Parameters.Add(new SqlParameter("@m_addMoney", SqlDbType.Decimal,9)).Value=addMoney;
myCommand.Parameters.Add(new SqlParameter("@m_memo", SqlDbType.NVarChar,100)).Value=memo;
SqlParameter returnParam = myCommand.Parameters.Add(new SqlParameter("@thisId",SqlDbType.Int));
returnParam.Direction = ParameterDirection.Output;

//select @thisId=SCOPE_IDENTITY() from caiwzhk
//SqlParameter returnParam = myCommand.Parameters.Add(new SqlParameter("@thisId",SqlDbType.Int));
//returnParam.Direction = ParameterDirection.Output;
//returnId = (int)myCommand.Parameters["@thisId"].Value;
myCommand.CommandText = "insert into jiaoyxx_pack ( customerId,customer,lastNum,receiptId,seller,principal,bargainTime) values (@m_customerId,@m_customer,@m_lastNum,@m_receiptId,@m_seller,@m_principal,@m_bargainTime) select @thisId=SCOPE_IDENTITY() from jiaoyxx_pack" ;
myCommand.ExecuteNonQuery ( ) ;

int returnId = (int)myCommand.Parameters["@thisId"].Value;
myCommand.CommandText = "insert into chongzhgl_pack ( bargainId,customerId,customer,addMoney,addTime,principal,memo) values ( " returnId.ToString() " ,@m_customerId,@m_customer,@m_addMoney,@m_bargainTime,@m_principal,@m_memo)" ;
myCommand.ExecuteNonQuery ( ) ;

myTrans.Commit ( ) ;//提交事务
}
catch ( Exception e )
{
myTrans.Rollback ( ) ;//回滚事务
throw new Exception ( e.ToString ( ) ) ;
}
finally
{
myCommand.Dispose();
myConn.Close ( ) ;
myConn.Dispose();
}



//======================================================================
//方法3:使用COM 事务
//优点:强大的事物处理机制,不但支持跨数据库,还支持负载平横等。
//缺点:运行效率不如上面两种,部署的时候优点麻烦
//======================================================================
using System.EnterpriseServices;
using System.Runtime.CompilerServices;
using System.Reflection;

// Supply the COM application name.
[assembly: ApplicationName("ComPlusExample")]//这个COM 应用程序的名称
// Supply a strong-named assembly.
[assembly: AssemblyKeyFileAttribute("ComPlusExample.snk")]//一定要strong-named文件

namespace cl
{
[Transaction(TransactionOption.Required)]//表示类是要支持事务的
public class ComPlusExample : ServicedComponent
{
[AutoComplete] //表示自动提交,hello()函数没有异常就commit,有异常就rollback
public string hello()
{
return "com 成功!!!";
}
}
}




//======================================================================
//备注
//======================================================================
1.创建强名称
  在编译组件之前,您需要为此组件的程序集指定一个强名称。如果不指定,COM 目录将不能识别该组件,也就无法注册它。实际上,您已经通过前面使用的 AssemblyKeyFile 属性指定了强名称,现在需要使用强名称工具 (Sn.exe) 创建强名称并使 GUID 与程序集关联。
打开命令提示。
要创建强名称,请在命令提示下键入以下代码,然后按 Enter 键。
sn -k ComPlusExample.snk
将 ComPlusExample.snk 文件从硬盘驱动器的根目录(通常为 C:/)复制到项目所在文件夹的 bin 目录下。
  现在,需要编译此程序,使它能生成在 COM 注册此组件必需的文件。在 Visual Studio .NET 中,在 Build(生成)菜单上,单击 Build(生成)。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Seata实现事务的原理主要包括以下几个方面: 1. Seata的架构:Seata采用了分布式事务协调器、事务管理器和存储模块的架构。其,分布式事务协调器负责全局事务的协调与控制,事务管理器负责具体业务数据的事务处理,存储模块用于存储全局事务的相关数据。 2. 四种事务模式:Seata支持四种事务模式,分别是XA模式、AT模式、TCC模式和SAGA模式。这些模式可以根据具体的业务场景来选择合适的方式进行事务处理。 3. XA模式:XA模式是一种经典的两阶段提交协议,通过协调器和各个分支事务的参与者来实现全局事务的一致性。 4. AT模式:AT模式是通过在业务代码嵌入事务逻辑,将事务操作和业务操作分离,通过事务管理器来实现事务的一致性。 5. TCC模式:TCC模式是通过事务的Try-Confirm-Cancel三个阶段来实现事务的一致性,通过业务代码的编程实现来协调各个分支事务的执行。 6. SAGA模式:SAGA模式通过一系列的补偿操作来实现事务的一致性,每个操作都可以通过补偿来回滚,从而保证全局事务的一致性。 总结起来,Seata实现事务的原理主要包括分布式事务协调器的架构设计、多种事务模式的支持以及事务管理器的功能等方面。这些设计和机制可以根据具体的业务需求来选择合适的方式进行事务处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Seata分布式事务原理](https://blog.csdn.net/m0_60491538/article/details/121405252)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值