Tag: transactionscope

如何在C#中使用TransactionScope?

我正在尝试使用TransactionScope,但不断得到下面的exception。 该应用程序运行在不同于数据库的机器上,如果这很重要的话。 我正在使用Sql Server 2005。 “分布式事务pipe理器(MSDTC)的networking访问已被禁用,请使用组件服务pipe理工具在MSDTC的安全configuration中启用DTC进行networking访问。 using (TransactionScope tsTransScope = new TransactionScope()) { //Do stuff here tsTransScope.Complete(); } 编辑 我根据反馈做出了一些反应。 现在我得到这个错误: {"Error HRESULT E_FAIL has been returned from a call to a COM component."} {"Communication with the underlying transaction manager has failed."} 解决scheme我认为接受的答案确定了我所得到的最初的问题。 第二个错误似乎是特定于entity framework。 我会张贴另一个问题。 以下是客户端的属性: 客户端http://www.portnine.com/datahttp://img.dovov.comMisc/client.jpg 以下是服务器上的属性: 服务器http://www.portnine.com/datahttp://img.dovov.comMisc/server.jpg

asynchronous提交或回滚事务作用域

众所周知,在.NET中引入async await模式时, TransactionScope被遗忘了。 如果我们试图在事务范围内使用一些await调用,它们就会被破坏。 现在这是固定的,由于范围构造选项 。 但是在我看来,还有一个缺失的部分,至less我无法find如何在简单的“事务范围”方式中这样做:如何等待范围的提交或回滚? 提交和回滚也是IO操作,它们应该是可以等待的。 但是,由于它们是在处理范围内发生的,我们将不得不等待处置。 这看起来不可行( using模式也不实际)。 我也看了一下System.Transactions.Transaction接口:在那里也没有可以使用的方法。 我明白,提交和回滚几乎只是向数据库发送一个标志,所以它应该是快速的。 但是对于分布式交易,这可能不那么快。 无论如何,这仍然是一些封锁IO。 关于分布式病例,请记住这可能会触发两个阶段提交。 在某些情况下,在第一阶段(准备阶段)需要额外的耐用资源。 那通常意味着对最近入伍的资源发出一些额外的查询。 在提交期间发生的所有事情。 那么有什么方法可以等待事务范围吗? 还是一个System.Transactions.Transaction ? 注意:我不认为这是“ asynchronous提交/回滚SqlTransaction? ”的副本。 SqlTransaction比系统事务更有限。 他们只能解决SQL Server,并且从不分发。 其他一些事务具有asynchronous方法,如Npgsql 。 现在,对于事务范围/系统事务有asynchronous方法, DbTransaction可能需要有asynchronous方法。 (我不知道系统事务的内部,但也许是使用这个ADO.NET合约,我们把连接join系统事务的方式让我觉得它并没有使用它。

“该操作对于事务状态”错误和事务范围无效

当我尝试调用包含SELECT语句的存储过程时出现以下错误: 该操作对交易状态无效 这是我的电话结构: public void MyAddUpdateMethod() { using (TransactionScope Scope = new TransactionScope(TransactionScopeOption.RequiresNew)) { using(SQLServer Sql = new SQLServer(this.m_connstring)) { //do my first add update statement //do my call to the select statement sp bool DoesRecordExist = this.SelectStatementCall(id) } } } public bool SelectStatementCall(System.Guid id) { using(SQLServer Sql = new SQLServer(this.m_connstring)) //breaks on this line […]

为什么是System.Transactions TransactionScope默认Isolationlevel可串行化

我只是想知道什么是一个很好的理由,使用Serializable作为默认的Isolationlevel可能是创build一个System.Transactions TransactionScope时 ,因为我想不出任何(似乎你不能通过web / app.config更改默认,所以你总是必须在你的代码中设置它) using(var transaction = TransactionScope()) { … // creates a Transaction with Serializable Level } 相反,我总是要写这样的样板代码: var txOptions = new System.Transactions.TransactionOptions(); txOptions.IsolationLevel = System.Transactions.IsolationLevel.ReadCommitted; using(var transaction = new TransactionScope(TransactionScopeOption.Required,txOptions)) { … // } 有任何想法吗?

TransactionScope过早完成

我有一个在TransactionScope中运行的代码块,在这个代码块中,我对数据库进行了几次调用。 select,更新,创build和删除整个色域。 当我执行我的删除我执行它使用SqlCommand的扩展方法,将自动重新提交查询,如果它死锁,因为这个查询可能会遇到死锁。 我相信当遇到死锁,并且该函数试图重新提交查询时,会发生此问题。 这是我收到的错误: 与当前连接相关的交易已经完成但尚未处理。 事务必须在连接可以用来执行SQL语句之前进行处理。 这是执行查询的简单代码(下面的所有代码都是在使用TransactionScope的情况下执行的): using (sqlCommand.Connection = new SqlConnection(ConnectionStrings.App)) { sqlCommand.Connection.Open(); sqlCommand.ExecuteNonQueryWithDeadlockHandling(); } 以下是重新提交死锁查询的扩展方法: public static class SqlCommandExtender { private const int DEADLOCK_ERROR = 1205; private const int MAXIMUM_DEADLOCK_RETRIES = 5; private const int SLEEP_INCREMENT = 100; public static void ExecuteNonQueryWithDeadlockHandling(this SqlCommand sqlCommand) { int count = 0; SqlException deadlockException = […]

获取TransactionScope使用asynchronous/等待

我正在尝试将async / await集成到我们的服务总线中。 我基于此示例实现了SingleThreadSynchronizationContext http://blogs.msdn.com/b/pfxteam/archive/2012/01/20/10259049.aspx 。 它的工作正常,除了一件事: TransactionScope 。 我等待TransactionScope内部的东西,它打破了TransactionScope 。 TransactionScope似乎并不async / await ,当然是因为它使用ThreadStaticAttribute将事物存储在线程中。 我得到这个例外: “TransactionScope嵌套错误。” 我尝试在排队任务之前保存TransactionScope数据,并在运行之前将其还原,但似乎没有改变任何事情。 而TransactionScope代码是一团糟,所以真的很难理解那里发生的事情。 有没有办法让它工作? 是否有一些替代TransactionScope ?

事务pipe理器已经禁用了对远程/networking事务的支持

我正在使用SQL Server和ASP.NET。 我有以下function: Using js = daoFactory.CreateJoinScope() Using tran = New Transactions.TransactionScope() '… tran.Complete() End Using End Using 但是,例外事务pipe理器已经禁用了对远程/networking事务的支持。 被抛出 JoinScope的描述: Public Class JoinScope Implements IJoinScope Implements IDisposable '… End Class 我已经在另一个应用程序中以相同的环境工作,没有问题,但在这里我有这个问题。 我能做些什么来解决这个问题?

SQL Server:跨池连接的隔离级别泄漏

正如前面的Stack Overflow问题( TransactionScope和Connection Pooling以及SqlConnection如何pipe理IsolationLevel? )所展示的,事务隔离级别在与SQL Server和ADO.NET(也是System.Transactions和EF)的池化连接之间泄漏,因为它们构build在ADO.NET)。 这意味着,任何应用程序都可能发生以下危险的事件序列: 发生请求需要显式事务来确保数据一致性 任何其他请求都不使用显式事务,因为它只是在进行不重要的读取。 这个请求现在将作为可序列化执行, 可能导致危险的阻塞和死锁 问题: 防止这种情况的最好方法是什么? 现在到处都需要使用明确的交易吗? 这里是一个独立的repro。 您将看到第三个查询将从第二个查询inheritanceSerializable级别。 class Program { static void Main(string[] args) { RunTest(null); RunTest(IsolationLevel.Serializable); RunTest(null); Console.ReadKey(); } static void RunTest(IsolationLevel? isolationLevel) { using (var tran = isolationLevel == null ? null : new TransactionScope(0, new TransactionOptions() { IsolationLevel = isolationLevel.Value })) using (var […]

在什么情况下,SqlConnection会自动列入一个环境TransactionScope事务?

SqlConnection在事务中“入围”意味着什么? 这是否意味着我在连接上执行的命令将参与交易? 如果是这样的话,在什么情况下SqlConnection会自动列入一个环境TransactionScope事务? 请参阅代码注释中的问题。 我对每个问题答案的猜测都在括号内的每个问题之后。 场景1:打开连接在事务范围内 using (TransactionScope scope = new TransactionScope()) using (SqlConnection conn = ConnectToDB()) { // Q1: Is connection automatically enlisted in transaction? (Yes?) // // Q2: If I open (and run commands on) a second connection now, // with an identical connection string, // what, if any, is the relationship of […]

TransactionScope在一些机器上自动升级到MSDTC?

在我们的项目中,我们使用TransactionScope来确保我们的数据访问层在事务中执行它的操作。 我们的目标是不要求我们的terminal用户的机器上启用MSDTC服务。 麻烦的是,在我们的一半开发人员机器上,我们可以禁用MSDTC来运行。 另一半必须启用它或他们得到“MSDTC on [服务器]不可用”错误消息。 这真让我挠头,让我认真考虑回滚到基于ADO.NET事务对象的基于TransactionScope的解决scheme。 这看起来很疯狂 – 对我们开发人员的一半工作(而不是升级)相同的代码在其他开发人员的升级。 我希望有一个更好的答案跟踪为什么交易升级到DTC,但不幸的是它不。 下面是一些会导致麻烦的代码示例,在尝试升级的机器上,尝试在第二个连接上升级。打开()(是的,当时没有其他连接打开)。 using (TransactionScope transactionScope = new TransactionScope() { using (SqlConnection connection = new SqlConnection(_ConStr)) { using (SqlCommand command = connection.CreateCommand()) { // prep the command connection.Open(); using (SqlDataReader reader = command.ExecuteReader()) { // use the reader connection.Close(); } } } // Do other stuff […]