分布式事务TransactionScope所导致几个坑

记录一下,个人见解,欢迎指正

错误:

1.该伙伴事务管理器已经禁止了它对远程/网络事务的支持。 (异常来自 HRESULT:0x8004D025)
2.事务已被隐式或显式提交,或已终止
3.此操作对该事务的状态无效。

通过分析得到这个是与分布式事务有关的问题。。有以下解决办法:

1.设置 数据库的链接字符串属性:  Enlist=false    类似于:Data Source="*;Initial Catalog=*;User ID=sa;Password=sa;Enlist=false;"     其实Enlist这个玩意儿默认是为true的。。表示是否开启事务登记。。   关闭的话,自然而然的就没了以上分布式事务所带来的的问题。

2.设置分布式事务的隔离机制。 上面的错误其实就是分布式事务交叉使用,所带来的TransactionScope里SqlClient 连接出错。所以理论上设置事务的隔离机制是可以解决问题的。(这种我没有实现)

3.设置客户端和服务端的DTC。打开控制面板->管理工具->组件服务,右击"本地DTC",属性--安全下,全勾上,事务管理器通信中的勾选"不要求进行验证“。意思大致上位开启远程/网络的事务支持。详细内容可以自行搜索。。

以上三个解决方式,个人建议。要是离不开分布式事务的话,就第三种方式。不想用分布式用第一种办法。有时间精力的话,可以试试第二种。另说,TransactionScope这个玩意儿真的是最好不要使用,亲身体会其性能跟稳定性较差。现在这么多好的ORM框架,随便一种都能将其秒杀。

转载于:https://www.cnblogs.com/cr-cool/p/11416465.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的使用TransactionScope的代码示例,用于演示如何将多个数据库操作包装在一个事务中: ``` using System; using System.Data.SqlClient; using System.Transactions; class Program { static void Main() { // 创建一个连接字符串 string connectionString = "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=TestDB;Integrated Security=True"; // 创建一个事务范围对象 using (TransactionScope scope = new TransactionScope()) { try { // 执行第一个数据库操作 using (SqlConnection connection1 = new SqlConnection(connectionString)) { connection1.Open(); SqlCommand command1 = new SqlCommand("INSERT INTO Customers (Name) VALUES ('Customer 1')", connection1); command1.ExecuteNonQuery(); } // 执行第二个数据库操作 using (SqlConnection connection2 = new SqlConnection(connectionString)) { connection2.Open(); SqlCommand command2 = new SqlCommand("INSERT INTO Orders (CustomerId, OrderDate) VALUES ((SELECT TOP 1 Id FROM Customers ORDER BY Id DESC), GETDATE())", connection2); command2.ExecuteNonQuery(); } // 提交事务 scope.Complete(); } catch (Exception ex) { // 回滚事务 Console.WriteLine("Transaction rolled back: " + ex.Message); } } } } ``` 在这个示例中,我们使用了TransactionScope类来创建一个事务范围,然后在这个范围内执行了两个数据库操作。如果两个操作都成功执行,我们调用了TransactionScope的Complete方法来提交事务。如果其中任何一个操作失败,我们就会在catch块中回滚事务

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值