- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我们的许多 DAL 代码都使用 TransactionScope 进行交易。这很好用,但是当我从 SQLCLR 过程内部使用此 DAL 代码时出现问题。事务升级到 MSDTC,这是我不想要的。
问题很容易重现:
CLR 实现
[SqlProcedure]
public static void ClrWithScope(string cmdText)
{
/* escalates to MSDTC when a transaction is already open */
using ( var scope = new TransactionScope())
{
using (var connection = new SqlConnection("context connection=true;"))
{
connection.Open();
using (var cmd = new SqlCommand(cmdText, connection))
{
SqlContext.Pipe.ExecuteAndSend(cmd);
}
}
scope.Complete();
}
}
[SqlProcedure]
public static void ClrWithTrans(string cmdText)
{
/* works as expected (without MSDTC escalation ) */
using (var connection = new SqlConnection("context connection=true;"))
{
connection.Open();
using (var tx = connection.BeginTransaction())
{
using (var cmd = new SqlCommand(cmdText, connection, tx))
{
SqlContext.Pipe.ExecuteAndSend(cmd);
tx.Commit();
}
}
}
}
用于执行 CLR 过程的 SQL 脚本
BEGIN TRANSACTION
exec dbo.ClrWithTrans "select * from sys.tables";
exec dbo.ClrWithScope "select * from sys.tables"; /* <- DOES NOT WORK! */
ROLLBACK TRANSACTION
错误
Msg 6549, Level 16, State 1, Procedure ClrWithScope, Line 0
A .NET Framework error occurred during execution of user defined routine or aggregate 'clrClrWithScope':
System.Transactions.TransactionAbortedException: Die Transaktion wurde abgebrochen. ---> System.Transactions.TransactionPromotionException: MSDTC on server 'BLABLA' is unavailable. ---> System.Data.SqlClient.SqlException: MSDTC on server 'BLABLA' is unavailable.
System.Data.SqlClient.SqlException:
bei System.Data.SqlServer.Internal.StandardEventSink.HandleErrors()
bei System.Data.SqlServer.Internal.ClrLevelContext.SuperiorTransaction.Promote()
System.Transactions.TransactionPromotionException:
bei System.Data.SqlServer.Internal.ClrLevelContext.SuperiorTransaction.Promote()
bei System.Transactions.TransactionStatePSPEOperation.PSPEPromote(InternalTransaction tx)
bei System.Transactions.TransactionStateDelegatedBase.EnterState(InternalTransaction tx)
System.Transactions.TransactionAbortedException:
bei System.Transactions.TransactionStateAborted.CreateAbortingClone(InternalTransaction tx)
bei System.Transactions.DependentTransaction..ctor(IsolationLevel isoLevel, InternalTransaction internalTransaction, Boolean blocking)
bei System.Transactions.Transaction.DependentClone(DependentCloneOption cloneOption)
bei System.Transactions.TransactionScope.SetCurrent(Transaction newCurrent)
bei System.Transactions.TransactionScope.PushScope()
bei System.Transactions.TransactionScope..ctor(TransactionScopeOption scopeOption)
bei Giag.Silo.Data.SqlClr.ClrWithScope(String cmdText)
. User transaction, if any, will be rolled back.
没有“BEGIN TRANSACTION”语句,dbo.ClrWithScope 调用工作正常。我想在 .Net Framework 中登记时不考虑由 SQLServer 启动的事务。
有没有办法解决这个问题。一个想法是手动创建一个 SqlTransaction 并使 TransactionScope 使用此事务,但我不知道该怎么做。另一种解决方案是在所有 DAL 代码中创建一个特例(实现起来并不有趣)。
有什么想法吗?
最佳答案
在 SQL CLR 中使用 TransactionScope 将始终提升/升级为 MSDTC 事务。似乎没有任何办法解决这个问题,即使在 SQL 2012 中也是如此。
来自 TechNet 关于 SQL CLR 和 TransactionScope ( http://technet.microsoft.com/en-us/library/ms131084.aspx )
TransactionScope should be used only when local and remote data sources or external resource managers are being accessed. This is because TransactionScope always causes transactions to promote, even if it is being used only within a context connection.
关于c# - 如何在不升级到 MSDTC 的情况下在 SQLCLR 中使用 TransactionScope,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12138091/
我几乎不敢在这里问这个问题,因为它似乎应该很容易通过谷歌或 ravendb.net 获得。但是,我一直很难找到将我的 RavenDB 升级到新版本的正确方法。我目前正在运行 573 版并希望升级到 6
这周我需要升级当前版本的 DNN。我目前使用的是 2.1.1。我不想每件事都做两次,所以,我有几个问题。 是否有升级工具或某些脚本可以帮助我进行升级。 我最好安装 4.9 还是 5.0。这是生产。 如
将 Sugarcrm 从 6.2 升级到 6.3 版本时遇到问题。当我升级本地 Sugarcrm 安装时,它可以工作,但是当我开始升级我的 Sugarcrm 6.2 站点并上传升级包时,它不会上传。
有没有办法绕过 Meteor 的自动更新功能?我坚持 Downloading meteor-tool@1.3.0_3... \ 当我尝试运行现有项目,或创建一个新项目或只是运行“
我已将应用内集成到我的 Andorid 应用程序中,用于单个产品 productone。 为此,我在我的 Google Play 控制台中创建了不同的产品 ID,如下所示: 1。 productone
我在将 TeamCity 版本 2017.1.1 升级到 2017.1.2 时遇到问题。这个问题涉及 TeamCity 和 PostgreSQL 的工作。我的工作: 停止 teamcity 进程 /e
我寻找了这个问题的具体答案,但找不到——即使是在 WAMPSERVER 网站上也是如此。我确定我忽略了它。 我有 Wampserver 2.0、MySQL 5.0.51b、PHP 5.2.6 和 Ap
我使用 Ubuntu 软件中心默认的 Eclipse 3.7。 我想将 Eclipse 升级到 kepler 版本,所以我添加了 repository 我收到以下错误消息: Cannot comple
你好 我只想安装 mercurial,但对于它需要 python 2.6 的所有版本,我尝试使用 .rpm 文件,但我唯一得到的是很多充满错误的行,它告诉我:需要安装在 2.6 之前和 2.5 之后的
我完全知道 Gradle 网站上有一些页面说明了如何升级,但仅限于 4.x 及更高版本。 我正在尝试关注 tutorial制作一个简单的“我的第一个”Minecraft 模组。在其中,您被告知安装 f
我们想升级 Kerberos(服务器和客户端) 当前:1.6.3-133.27.1 目标:1.6.3-133.49.97.1 问题是如果我们用包管理器升级它,下面会发生什么? KDC 数据库 所有主要
背景 原计划 2019 年发布的 Vue3,又经过一年的再次打磨,终于于去年 9 月正式发布。随后,不少 UI 组件库都积极参与适配,去年 12 月,Element-plus(
我有一个版本为 2.3.4 的 grails 项目,我需要尽可能升级到最新版本。查看文档我意识到从 2.x 到 3.x 有巨大的变化。 问题是:从 2 到 3、从 3 到 4、从 4 到 5 逐步升级
我正在将 API 项目从 .net5 升级到 .net6 它以前工作,现在它崩溃 内部异常消息“抛出了‘Unity.Exceptions.InvalidRegistrationException’类型
我将我的项目从 expo 44 升级到 expo 45,现在我有无数这样的错误: The module 'MaterialIcons' can't be used as JSX component.
我已经升级了掌 Helm 模板(手动) 以前的片段depoloyment.yaml : apiVersion: apps/v1beta2 kind: Deployment metadata: na
我正在尝试将我的 Scala Play Framework 应用程序升级到 2.8,这涉及将 SBT 升级到 1.x。 在我的 build.propeties 我有 sbt.version=1.3.5
我想在我的 Windows 服务器上安装 PHPUnit 3.7。我遵循了各种说明 here并以 PHPUnit 3.4.1 结束。当我尝试使用以下方法再次安装它时: pear update chan
Microsoft.Net 4.5 即将推出,我想在 MS 发布最终版本时升级我的 clickonce 应用程序。 我的问题是:已经安装了 clickonce 应用程序(使用 .net 4.0)的用户
为了将 Angular 8 更新到 9,我正在按照官方文档升级。 这建议首先更新到最新版本的 angular 8,例如: ng update @angular/core@8 @angular/cli@
我是一名优秀的程序员,十分优秀!