问题标签 [transactionscope]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
sql-server - 如果其中一个数据库是只读的,是否会发生分布式事务升级?
我们正在执行从源数据库到目标数据库的导入过程。我们需要以自动化的方式频繁地运行这些导入。
源位于与目标不同的服务器上。两者都是 MS SQL 2008。我们使用 Linq2SQL 访问源,使用自定义数据层访问目标。我们从不修改源数据库(尽管我们目前不将其恢复为只读)。但是,现在当我们在 transactionScope 中运行导入时,整个事务被提升为 DTC,因为我们访问了不同服务器上的两个 DB。
如果我们将源数据库设为只读,它还会这样做吗?
在这种情况下如何避免 DTC 促销还有其他建议吗?
Remus 回答的后续问题(再次感谢):
跟进#1:我的导入例程的结构是它从源导入记录并在目标中创建新记录。像这样:
您是说用 RequiresNew 包围 TransactionScope 中的 Linq2Sql 位吗?或者,我想,因为我真的不关心源头的事务,我可以用带有 Suppress 的 TransactionScope 来包围该连接是否包含在任何事务中,对吧?
跟进#2:
当你说“打开第二个连接,即使是同一个数据库” - 我已经阅读了几个关于这个的变体:
- “第二个连接” == Connection 对象的第二个实例,即使它完全相同的连接字符串
- “第二个连接” == 连接到单独的资源管理器和 SQL2005 之前,这意味着与上面的 1 相同,但在 SQL2008 上,这意味着一个单独的实例(即同一实例上的两个 DB 不会被提升)
c# - 在 nhibernate 中缺少对环境事务的支持?
我知道 NHibernate 支持环境事务,因为 NHibernate 会话在事务范围内参与环境事务。但是,有一些奇怪之处,请考虑以下测试:
此测试失败。NHibernate 将如何确保环境事务不会持久化到数据库中?
entity-framework - 我不能在事务范围内从实体框架调用存储过程吗?
我有一个使用实体框架在不同实体中进行一些更改/插入的方法,所有这些都在单个事务范围内。这些更改效果很好。
当我需要在这些操作中间使用存储过程时,我的问题就开始了。该过程只在一个表中插入,并且没有明确的事务声明。我试过声明一个事务并在那里提交,但问题是一样的。
我不能在事务范围内从实体框架 (EF1) 调用存储过程吗?
只有在 transaction.Complete() 之后,当 using 块关闭时才会引发此异常。
内部异常:
更新:开始赏金
今天我不再通过实体框架执行此过程调用。我正在通过 ADO.net 调用该过程,这是我的解决方法。但是问题仍然存在,我应该需要在不久的将来进行一些调用,也许在事务范围内。
informix - Informix .NET 提供程序和 TransactionScope 未回滚
我有一个小的概念验证分布式事务应用程序,它正在对两个表进行简单的插入——一个是 MS SQL Server 表,另一个是 Informix Dynamic Server 表。当抛出异常时,问题就来了。如果我使用 Informix 的 OLE DB 驱动程序,一切正常——两个插入都回滚;如果我为 Informix 使用 .NET 数据提供程序,则 Informix 插入不会回滚。
有人对发生的事情有任何想法吗?
在代码片段中,您会注意到注释掉的 EnlistTransaction() 方法。当显式调用时,我得到一个异常,表明该方法没有实现。
代码片段:
连接字符串:
nhibernate - Informix、NHibernate、TransactionScope 交互困难
我有一个小程序试图使用 Informix .NET 提供程序将 NHibernate 插入包装到 TransactionScope 对象中的 Informix 数据库中。我收到下面指定的错误。没有 TransactionScope 对象的代码可以工作——包括当插入被包装在 NHibernate 会话事务中时。关于问题是什么的任何想法?顺便说一句,如果没有 EnterpriseServicesInterop,Informix .NET 提供程序将不会参与 TransactionScope 事务(在不涉及 NHibernate 的情况下进行验证)。
代码片段:
堆栈跟踪:
NHibernate.ADOException 未处理 Message="Could not close IBM.Data.Informix.IfxConnection connection" Source="NHibernate" StackTrace: at NHibernate.Connection.ConnectionProvider.CloseConnection(IDbConnection conn) at NHibernate.Connection.DriverConnectionProvider.CloseConnection(IDbConnection conn ) 在 NHibernate.Tool.hbm2ddl.SuppliedConnectionProviderConnectionHelper.Release() 在 NHibernate.Tool.hbm2ddl.SchemaMetadataUpdater.GetReservedWords(方言方言,IConnectionHelper connectionHelper) 在 NHibernate.Tool.hbm2ddl.SchemaMetadataUpdater.Update(ISessionFactory sessionFactory) 在 NHibernate.Impl.SessionFactoryImpl NHibernate.Cfg.Configuration 中的 ..ctor(Configuration cfg, IMapping mapping, Settings settings, EventListeners listeners)。BuildSessionFactory() at HelloNHibernate.Employee.OpenSession() in D:\Development\ScratchProject\HelloNHibernate\Employee.cs:line 73 at HelloNHibernate.Employee.TestTScope() in D:\Development\ScratchProject\HelloNHibernate\Employee.cs:line 53 在 HelloNHibernate.Program.Main(String[] args) 在 D:\Development\ScratchProject\HelloNHibernate\Program.cs:第 19 行在 System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) 在 System.AppDomain.ExecuteAssembly (String assemblyFile, Evidence assemblySecurity, String[] args) 在 Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 在 System.Threading.ThreadHelper.ThreadStart_Context(Object state) 在 System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback 回调,对象状态)在 System.Threading.ThreadHelper.ThreadStart() InnerException:IBM.Data.Informix.IfxException Message="ERROR - no error information available" Source="IBM.Data.Informix" ErrorCode=-2147467259 StackTrace:在 IBM。 Data.Informix.IfxConnection.HandleError(IntPtr hHandle, SQL_HANDLE hType, RETCODE retcode) 在 IBM.Data.Informix.IfxConnection.DisposeClose() 在 IBM.Data.Informix.IfxConnection.Close() 在 NHibernate.Connection.ConnectionProvider.CloseConnection( IDbConnection conn) 内部异常:ErrorCode=-2147467259 StackTrace:在 IBM.Data.Informix.IfxConnection.DisposeClose() 在 IBM.Data.Informix.IfxConnection.Close() 的 IBM.Data.Informix.IfxConnection.HandleError(IntPtr hHandle, SQL_HANDLE hType, RETCODE retcode)在 NHibernate.Connection.ConnectionProvider.CloseConnection(IDbConnection conn) InnerException:ErrorCode=-2147467259 StackTrace:在 IBM.Data.Informix.IfxConnection.DisposeClose() 在 IBM.Data.Informix.IfxConnection.Close() 的 IBM.Data.Informix.IfxConnection.HandleError(IntPtr hHandle, SQL_HANDLE hType, RETCODE retcode)在 NHibernate.Connection.ConnectionProvider.CloseConnection(IDbConnection conn) InnerException:
asp.net - 中等信任的 TransactionScope
我正在运行一个由 Mosso 托管的 ASP.NET MVC 应用程序,有人告诉我他们无法启用 DTC,因为他们以中等信任运行所有内容。
因此,在执行引用的代码时: TransactionScope 我收到以下错误。事务管理器已禁用对远程/网络事务的支持。(来自 HRESULT 的异常:0x8004D024)
有没有办法解决这个问题?
c# - TransactionScope 帮助器可以毫无故障地耗尽连接池 - 帮助?
不久前,我问了一个关于 TransactionScope 升级到 MSDTC 的问题,而我没想到会这样。(上一个问题)
归结为,在 SQL2005 中,为了使用 TransactionScope,您只能在 TransactionScope 的生命周期内实例化并打开单个 SqlConnection。使用 SQL2008,您可以实例化多个 SqlConnection,但在任何给定时间只能打开一个。SQL2000 将始终升级为 DTC ...我们在我们的应用程序中不支持 SQL2000,一个 WinForms 应用程序,顺便说一句。
我们对单连接问题的解决方案是创建一个 TransactionScope 帮助器类,称为 LocalTransactionScope(又名“LTS”)。它包装了一个 TransactionScope,最重要的是,它为我们的应用程序创建和维护了一个 SqlConnection 实例。好消息是,它有效——我们可以在不同的代码片段中使用 LTS,它们都加入了环境事务。非常好。问题是,创建的每个根LTS 实例都会从连接池中创建并有效地终止一个连接。通过“有效地杀死”,我的意思是它将实例化一个 SqlConnetion,它将打开一个新的连接(无论出于何种原因,它从不重用池中的连接),并且当该根 LTS 被释放时,它会关闭并释放 SqlConnection ,该连接应该将连接释放回池以便可以重用,但是,它显然永远不会被重用。池膨胀直到它被最大化,然后当建立一个 max-pool-size+1 连接时应用程序失败。
下面我附上了 LTS 代码的精简版本和一个示例控制台应用程序类,它将演示连接池耗尽。为了观察您的连接池膨胀,请使用 SQL Server Managment Studio 的“活动监视器”或此查询:
我在此处附上了 LTS,以及一个示例控制台应用程序,您可以使用它自己演示它将使用池中的连接并且永远不会重新使用或释放它们。您需要添加对 System.Transactions.dll 的引用以供 LTS 编译。
需要注意的是:打开和关闭SqlConnection的是根级LTS,它总是在池中打开一个新连接。嵌套 LTS 实例没有任何区别,因为只有根 LTS 实例建立了 SqlConnection。如您所见,连接字符串始终相同,因此应该重用连接。
是否有一些我们没有遇到的神秘条件导致连接不被重新使用?除了完全关闭池之外,还有其他解决方案吗?
这是一个将显示连接池耗尽的 Program.cs:
c# - C# - System.Transactions.TransactionScope
我对 TransactionScope 类很好奇。
在大多数情况下,我认为它是为数据库连接而设计的(这就是我使用它的目的)。
我的问题是,您可以将任何代码放在 TransactionScope 的 using-block 中以使其具有事务性吗?MS 文档对此并不清楚。
如果它可以用于使数据库连接以外的代码成为事务性的,那么哪些是受支持的?如果它可以使 System.IO.File 操作具有事务性,我会觉得很疯狂。
c# - TransactionScope 与 C# 中的文件
我一直在使用 TransactionScope 来处理数据库,感觉很好。我正在寻找的是以下内容:
但显然这不起作用——如果有 20 个文件,并且第 9 个文件发生异常,则之前的所有 8 个保持更改,其余保持不变——不执行回滚。那么,为文件实现类似作用域的行为的最佳方法是什么?
我希望有一个简单的答案,但如果没有,你能给我一些指示,或者给我指一个相关的文章吗?
c# - 消息队列的 TransactionScope 问题
我正面临下一个问题。我有一段代码是这样的:
在 ProcessDataRelatedWithThePreviousInserts 我检查一个条件,如果需要,工作流的其余部分被重定向到其他服务器中的消息队列。在另一台服务器中,我恢复消息,并继续工作流程(基本上,进行一些与 DoSomething 方法相关的其他插入)。
这是理论上的,因为我只有在 DoSomething 方法中删除 TransactionScope 时才能做到这一点。有没有办法完成我想做的事情,或者我需要改变交易的处理方式?