- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
当我们需要在我们的应用程序中进行数据库访问时,我们使用以下模式:
CreateOpenConnection
的静态工厂类这只不过是 new SqlConnection(myConnectionString)
并调用 Open()
在上面。在我们执行查询之前调用此方法,并在查询返回后释放连接。work.Commit()
提交到数据库。像这样:工作.提交:
using (var tranScope = new TransactionScope(TransactionScopeOption.RequiresNew))
{
using (var conn = DapperFactory.CreateOpenConnection())
{
var count = _changeTracker.CommitChanges(conn);
tranScope.Complete();
return count;
}
}
这似乎非常适合作为 Web 服务的一部分的一般用途,但是当我尝试将它与 Rebus 结合使用时,目前给我带来了 MSDTC 麻烦。
据我所知,Rebus(当它处理队列中的消息时)创建了一个新的 TransactionScope
这样在处理消息失败的情况下,可以回滚内容。现在,到目前为止,这本身运行良好。我可以打开一个新的 SqlConnection
在 Rebus 消息处理程序中没有任何问题(但是,在同一个 Rebus TransactionScope
中使用我们遗留的 Entity Framework 查询和手动 SqlConnections 不起作用,但我现在不认为这是一个问题).但是昨天我问了以下问题:
Serial processing of a certain message type in Rebus
答案似乎是使用 Rebus 的 saga 特性。我尝试实现它并对其进行配置,以便将 Rebus saga 持久保存到新的 SQL Server 数据库(具有不同的连接字符串)。据推测,使用该 SQL Server 持久性会打开一个 SqlConnection
它自己的,因为任何时候我尝试创建一个 SqlConnection
现在,我得到以下异常:
Network access for Distributed Transaction Manager (MSDTC) has been disabled. Please enable DTC for network access in the security configuration for MSDTC using the Component Services Administrative tool.
考虑到配置和性能开销,启用 MSDTC 是我非常非常想避免的事情。我可能是错的,但这似乎也没有必要。
我推测这里发生的是 Rebus 创建了一个环境 TransactionScope
那SqlConnection
它创建了该范围的登记。当我尝试创建自己的 SqlConnection
时它还尝试加入该环境范围,并且由于涉及多个连接,它被提升为 MSDTC,但失败了。
我知道如何解决这个问题,但我不知道这样做是否正确。我会做的是:
Enlist=false
到我的应用程序的连接字符串,以便它永远不会登记到环境事务。Commit
方法,这样它就不会创建一个新的 TransactionScope
(我的连接将不再订阅,因为我只是告诉它不应该)但它使用 conn.BeginTransaction
.像这样:
var transaction = conn.BeginTransaction();
try
{
var count = _changeTracker.CommitChanges(conn);
transaction.Commit();
return count;
}
catch
{
transaction.Rollback();
throw;
}
finally
{
transaction.Dispose();
}
我只是不确定这是否是正确的方法以及可能的缺点是什么。
有什么建议吗?
更新:澄清一下,这不是 work.Commit()
这一直给我带来问题,我很确定它会起作用,但我从来没有到达那里,因为我的查询失败了。
失败的例子:
public int? GetWarehouseID(int appID)
{
var query = @"
select top 1 ID from OrganizationUnits o
where TypeID & 16 = 16 /* warehouse */";
using (var conn = _dapper.OpenConnection())
{
var id = conn.Query<int?>(query).FirstOrDefault();
return id;
}
}
这会在 TransactionScope
时被调用由 Rebus 以及在 SqlConnection
之后创建由 Rebus 打开。打开我的 SqlConnection
,它尝试征募并崩溃
最佳答案
您看到这个我有点惊讶,因为 RequiresNew
应该 意味着它与其他事务隔离;通常,此消息意味着在事务范围内已激活 2 个连接 - 您确定没有其他代码在该 block 内创建/打开连接吗?
您提出的解决方案应该可行 - 虽然在某些方面 TransactionScopeOption.Suppress
可能比更改您的配置更方便(但两者都应该可行)。但是,存在一个问题:ADO.NET 事务必须传递给各个命令,因此您需要(也稍微整理一下代码):
using(var transaction = conn.BeginTransaction()) {
try {
var count = _changeTracker.CommitChanges(conn, transaction);
transaction.Commit();
return count;
} catch {
transaction.Rollback();
throw;
}
}
其中 CommitChanges
接受交易 - 可能使用可选参数:
int CommitChanges(DbConnection connection, DbTransaction transaction = null)
{ ... }
DapperFactory
的命名表明您使用的是“dapper”——在这种情况下,无论它是否为 null,您都可以将其传递给“dapper”,即
conn.Execute(sql, args, transaction: transaction);
关于c# - SqlConnection 并避免升级到 MSDTC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16854500/
我的 ASP.NET Web 表单系统有问题。 它在我们的测试服务器上工作,但现在我们将其投入使用,其中一台服务器位于 DMZ 内,而 SQL 服务器位于该区域之外(尽管仍然在我们的网络上 - 尽管是
我现在面临 MSDTC 事务超时问题。由于历史原因,我们仍然有很多遗留代码通过 C++ ODBC 运行 DB 操作,并且连接默认升级为 MSDTC。问题是当我尝试执行一个超过 1 分钟的冗长操作时,事
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8年前关闭。 Improve this q
我有一个相当大的应用程序,它使用 MSDTC。我应该打开多少个端口?有什么办法可以确定吗? 编辑:我知道 什么 我需要打开的端口,我不知道多少我需要。 最佳答案 我想 Migol 想知道 RPC dy
如果我设置了两台 Windows Server 2008 r2 机器,我可以让分布式事务仅在一个方向上工作。当我可以使 DTCPing 成功工作时,DTC 正在工作。不过,DTCPing 仅在我从一台
我的应用程序中曾经遇到过以下异常, Unable to get the address of the distributed transaction coordinator for the serve
我在域中的计算机上运行的应用程序使用TransactionScope(依赖于MS DTC)。 SQL Server在域中未包含的计算机上运行。如何在域中的计算机和未在Windows域中运行的计算机上启
我有一个每天检索数据并将其存储到数据库中的应用程序。直到最近,此应用程序一直驻留在与 SQL 服务器相同的机器上,但由于一些所需外围设备的硬件问题,它已被移动到运行 Windows XP 的单独机器上
问题是我们在使用 TransactionScope 的独立网络服务器(Windows 2003 SP2 - 机器名称是 TESTAPP,可以在下面的日志中看到)上有一个网站。 SQL Server 2
我有一个带有两个表的 SQL Server 2008 数据库,一个使用 TransactionScope 的 .NET 4.5 应用程序,对数据库有两个查询,每个都使用它们自己的独立连接,共享一个单个
那么,MSDTC 是否会消耗系统(服务器和应用程序)的大量资源? 过去,我编写了几个依赖 MSDTC 进行数据库事务的大型 Web 应用程序。我从来没有调查过服务器上会有多少消耗。 目前,我正在使用
我有一个 WinForms/WCF/SQLServer 应用程序,我正在尝试像这样使用 MSDTC 事务: using System.Transactions; // ... var transOpt
我收到错误: communication with the underlying transaction manager has failed 当我尝试从 visual studio 2010 运行我
我工作的公司想在我们支持 SQL Server 的应用程序中使用 Always on 可用性组架构。我们有 3 个直接安装的数据库,其中一个按配置分区,我们目前使用 MSDTC 来协调这三个数据库之间
我注意到非常简单的分布式事务在第一次运行时需要很长时间(3-4 秒)才能完成。但是如果再次调用相同的事务范围,速度会快得多(30 毫秒)。似乎 MSDTC 在一个小时后进入休眠状态。一小时后,下一个要
我有两个存储库指向同一个 SQL Server 2008 R2 (10.50.2550.0) 数据库。一个存储库基于 Entity Framework ,另一个使用常规 SqlConnection。我
我以一种模糊的方式了解常规 ACID 事务的工作原理。您在数据库上执行一些工作,直到设置了某种提交标志才确认工作。提交部分基于一些基本假设(例如单个磁盘 block 写入是原子的)。如果发生灾难性错误
我对事务和 msdtc 如何协同工作有一些基本的困惑。 我有一个基本的服务器/客户端 winforms 应用程序。该应用程序使用transactionscope来封装在sql服务器上执行的多个sql命
在我们的项目中,我们使用 TransactionScope 来确保我们的数据访问层在事务中执行它的操作。我们的目标是不要求在最终用户的计算机上启用 MSDTC 服务。 问题是,在我们一半的开发人员机器
当我们需要在我们的应用程序中进行数据库访问时,我们使用以下模式: 为了查询,我们有一个带有方法 CreateOpenConnection 的静态工厂类这只不过是 new SqlConnection(m
我是一名优秀的程序员,十分优秀!