C# 使用相同连接的TransactionScope和方法调用
我正在使用创建一个包含多个sql语句的方法。现在我需要调用第二个方法,该方法也使用相同的连接,我在C# 使用相同连接的TransactionScope和方法调用,c#,sql-server-2012,transactions,ado.net,transactionscope,C#,Sql Server 2012,Transactions,Ado.net,Transactionscope,我正在使用创建一个包含多个sql语句的方法。现在我需要调用第二个方法,该方法也使用相同的连接,我在connection.Open()处收到以下异常: 分布式事务管理器(MSDTC)的网络访问已完成 残废请在安全设置中为网络访问启用DTC 使用组件服务管理配置MSDTC 工具 这是伪代码: public static void Method1() { using (TransactionScope scope = new TransactionScope()) {
connection.Open()
处收到以下异常:
分布式事务管理器(MSDTC)的网络访问已完成
残废请在安全设置中为网络访问启用DTC
使用组件服务管理配置MSDTC
工具
这是伪代码:
public static void Method1()
{
using (TransactionScope scope = new TransactionScope())
{
bool success = true; // will be set to false in an omitted catch
using (var connection = new SqlConnection(ConnectionString1))
{
// ...
if(somethingHappened)
Method2();
}
if(success)
scope.Complete();
}
}
public static void Method2()
{
using (var connection = new SqlConnection(ConnectionString1))
{
connection.Open(); // BOOOM!
// ...
}
}
如何避免此异常而不重复
Method1
中Method2
中的代码?我不知道确切答案,但我会将该连接设为成员,并跟踪它是否打开
然后在Method1和Method2中,我将通过一些GetConnection()获得连接,这将在第一次使用时打开连接
在阅读了这些评论之后,我建议使用一个私有的DoMethod2,它接收一个连接对象 我不知道确切的答案,但我会让这个连接成为一个成员,并跟踪它是否打开 然后在Method1和Method2中,我将通过一些GetConnection()获得连接,这将在第一次使用时打开连接
在阅读了这些评论之后,我建议使用一个私有的DoMethod2,它接收一个连接对象 如果在同一
TransactionScope
下打开了多个连接,它将自动升级到DTC
在调用Method2
之前,您需要关闭第一个连接
public static void Method1()
{
using (TransactionScope scope = new TransactionScope())
{
bool success = true; // will be set to false in an omitted catch
bool isSomethingHappened
using (var connection = new SqlConnection(ConnectionString1))
{
isSomethingHappened = // Execute query 1
}
if(somethingHappened)
Method2();
if(success)
scope.Complete();
}
}
如果在同一
TransactionScope
下打开了多个连接,它将自动升级到DTC
在调用Method2
之前,您需要关闭第一个连接
public static void Method1()
{
using (TransactionScope scope = new TransactionScope())
{
bool success = true; // will be set to false in an omitted catch
bool isSomethingHappened
using (var connection = new SqlConnection(ConnectionString1))
{
isSomethingHappened = // Execute query 1
}
if(somethingHappened)
Method2();
if(success)
scope.Complete();
}
}
同一事务作用域下的嵌套连接将升级为分布式事务 从SQL server 2008及更高版本开始,同一事务作用域下的多个(非嵌套)连接将不会升级为分布式事务
有关更多信息,请参见问题相同事务作用域下的嵌套连接将升级为分布式事务 从SQL server 2008及更高版本开始,同一事务作用域下的多个(非嵌套)连接将不会升级为分布式事务
有关更多信息,请参见问题我也得到了这个答案,但在不同的连接字符串上,请检查答案是否为64票helps@Steve,应在不同的连接字符串上出现此错误behavior@mybirthname:如果可能,我希望避免使用MSDTC,因为它不需要额外的开销。如果我理解正确,只有当一个分布式事务涉及多台物理计算机时,才需要使用DTC。事实并非如此,它是同一台服务器上的同一个数据库,实际上是同一个连接字符串。如果同时打开多个连接,它将自动升级到DTC-但不确定Sql server的版本我也得到了这一点,但是在不同的连接字符串上。请检查答案是否为64helps@Steve,应在不同的连接字符串上出现此错误behavior@mybirthname:如果可能,我希望避免使用MSDTC,因为它不需要额外的开销。如果我理解正确,只有当一个分布式事务涉及多台物理计算机时,才需要使用DTC。事实并非如此,它是同一服务器上的同一数据库,实际上是同一个连接字符串。如果同时打开多个连接,它将自动升级到DTC,但不确定Sql server的版本。问题是关于相同的连接字符串,而不是相同的连接:/Ah。问题是关于相同的连接字符串,而不是相同的连接:/