gpt4 book ai didi

c# 在 TransactionScope 事务中获取当前连接

转载 作者:行者123 更新时间:2023-11-30 17:21:06 30 4
gpt4 key购买 nike

我想在 .net 2.0 项目中围绕一些业务逻辑进行事务性的一系列 sp 调用(sql server 2005)

using(TransactionScope...)

不幸的是,我从另一个项目继承了 DAL,我不想在那里做太多更改。问题是每个调用存储过程的方法都会打开一个新连接。

所以,我的问题是:有没有办法检索当前事务使用的连接,即从 Transaction.Current 检索?

谢谢

s.

更新:请告诉我这个控制台应用程序有什么问题(vs2005、.net 2.0、Sql server 2005)

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using System.Data;
using System.Transactions;

namespace ConsoleApplication1
{
public class Program
{
static void Main(string[] args)
{
using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required))
{
Console.WriteLine("1");
test();
Console.WriteLine("2");
test();
}
Console.WriteLine("END");
}

public static void test()
{
string connectionString = @"Persist Security Info=True;User ID=usr123;Password=123;Initial Catalog=db123;Data Source=myserver\myinstance;Connect Timeout=180;";

using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
}
}
}
}

最佳答案

好的,有几件事:

  1. 我怀疑 TransactionScope 甚至有 (Sql)Connection 的概念。原因是它确实适用于各种事务性资源,无论是数据库、消息队列系统还是其他任何资源。您可能需要引用 MSDN Docs for System.Transactions了解更多信息。所以,我猜你的方法从一开始就注定要失败。

  2. 在您的示例中,您缺少“ts.Complete()”调用,因此您的(分布式)事务将始终在 using-Scope 结束时回滚。现在,这与您描述的问题无关,但仍然值得指出。

  3. 您的环境事务(类似于 TransactionScope 实例的事务)被传播到分布式事务,因为您在其中使用了多个连接。所以本质上,您系统上的 DTC 需要与数据库服务器上的 DTC 通信。为此,两者都必须正确配置。

要配置 DTC,请通过执行 C:\Windows\System32\com\comexp.msc 运行“组件服务”管理控制台。在 TreeView 中导航到“Component Services\Computers\My Computer”。在上下文菜单中打开“属性”。在属性对话框中选择“MSDTC”选项卡,在其上单击“安全配置...”按钮。

在对话框中确保选择了以下选项:

  • “网络 DTC 访问”
  • “允许远程客户端”
  • “允许入站”
  • “允许出站”
  • “启用交易 Internet 协议(protocol) (TIP) 交易”
  • “启用 XA 事务”

(注意:其中一些实际上可能不是必需的,YMMV)

您可能还想设置为“无需身份验证”,具体取决于您本地的政策/要求。

您需要在两个系统上执行此操作:运行您的应用程序的系统和具有数据库的系统。

关于c# 在 TransactionScope 事务中获取当前连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3719024/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com