【问题标题】:Side effects of enabling DTC in SQL Server在 SQL Server 中启用 DTC 的副作用
【发布时间】:2015-12-23 22:02:42
【问题描述】:

我有一个大型旧数据库,其中 DTC 被禁用,我需要启用它以使用事务隔离级别“未提交读”,但我担心启用它的副作用。

这是特定查询所必需的,不会在其他任何地方使用。

有谁知道这是否会给我们现有的遗留系统带来任何问题?


详情:

我试图在我的 .NET 应用程序中使用TransactionScope,隔离级别为“未提交”,以便不锁定我的查询。此查询搜索被另一个应用程序的事务锁定在数据库中的寄存器。

也许有一种方法可以在不更改 DTC 配置的情况下使其正常工作。任何帮助将不胜感激!

【问题讨论】:

  • 我不是 DTC 方面的专家,但我不认为直接通过单个连接直接读取未提交就需要 DTC,SQL Server 应该在没有 DTC 的情况下本机支持该事务级别。您在查询链接服务器吗?如果不是从同一个客户端打开多个连接,并且您只是在事务中直接查询一个数据库(而不是通过链接服务器),那么通常不需要 DTC。你遇到了什么错误?
  • 嗨@AaronLS,当我启用READ UNCOMMITTED 事务级别时,我收到以下错误:分布式事务管理器(MSDTC)的网络访问已被禁用。请使用组件服务管理工具在 MSDTC 的安全配置中启用 DTC 以进行网络访问
  • 我没有使用链接服务器,我正在从另一个应用程序打开一个新连接
  • 您是否在应用程序中使用了 TransactionScope?您可以在没有它的情况下指定隔离级别,以避免 MSDTC 依赖。

标签: .net sql-server


【解决方案1】:

TransactionScope 会根据需要自动将事务提升/登记为分布式事务,这需要 MSDTC 正在运行并正确配置。要消除独立查询对 MSDTC 的依赖,请尝试以下方法之一:

  • 将 SqlTransaction 与 System.Data.IsolationLevel.ReadUncommitted 一起使用
  • 在运行查询之前对连接执行 SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 查询
  • 在查询中指定 NOLOCK 锁定提示

请注意,READ UNCOMMITED 将导致脏读(包括丢失或重复的数据),因此仅应在并发优势超过数据完整性的情况下使用它。另一种方法是打开READ_COMMITTED_SNAPSHOT 数据库选项,以便使用行版本控制而不是锁定来提供默认READ COMMITTED 隔离级别的完整性。见Read committed Snapshot VS Snapshot Isolation Level

【讨论】:

  • @AaronLS,我在回答中添加了说明,因为我并不打算暗示它始终是分布式事务。我的主要观点是建议不要仅将 TransactionScope 用于数据库事务隔离级别。
  • 谢谢丹!只需要前两个步骤
  • @fabriciorissetto,对不起,我不清楚,但只需要其中一个建议。我编辑了我的答案。
猜你喜欢
  • 1970-01-01
  • 2011-02-23
  • 2016-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-06
相关资源
最近更新 更多