Tag: transactionscope

HRESULT:0x8004D00E使用TransactionScope – C#

当我尝试在连接到SQL Server 2000的Windows Server 2003 Standard Edition SP1计算机上运行C#WinForms应用程序时,我收到以下错误,转换WinForms应用程序中的数据并将转换后的数据插入到SQL Server 2005应用程序中。 我使用SSPI连接到每个数据库。 代码包含在TransactionScope块中: System.TimeSpan TransactionTimeOut = new TimeSpan(0, 40, 0); using(TransactionScope Scope = new TransactionScope(TransactionScopeOption.RequiresNew, TransactionTimeOut)) { try { //meat of transaction… } catch(Exception ex) { throw ex; } Scope.Complete(); } 错误消息: 例外:事务已被隐式或显式提交或中止。 内部exception:事务已被隐式或显式提交或中止(HRESULTexception:0x8004D00E) 任何人都知道可能导致此问题的原因是什么?

易失性IEnlistmentNotification和TransactionScope.AsyncFlowEnabled = true

除了.NET 4.5.1之外,TransactionScope上还有一个新选项,可以使用异步流。 这允许编写以下客户端代码 using(var txt = new TransactionScope(…, TransactionScopeAsyncFlowOption.Enabled) { await sender.SendAsync(); } 到现在为止还挺好。 但是当我需要实现一个易变的IEnlistmentNotification时,我正在努力做到这一点。 让我们假设以下场景,假设:我的底层基础架构从下到上完全异步 public class MessageSender : ISendMessages { public async Task SendAsync(TransportMessage message, SendOptions options) { await sender.SendAsync(message); } } 所以我想要实现的是引入像这样的易失性IEnlistmentNotification: internal class SendResourceManager : IEnlistmentNotification { private readonly Func onCommit; public SendResourceManager(Func onCommit) { this.onCommit = onCommit; } public void […]

将TransactionScope与SQLite一起使用会导致数据库锁定exception

我正在尝试调整使用TransactionScope ac#代码,并与Oracle一起使用SQLite。 我的代码的结构是这样一种方式,即访问SQLite数据库的事务范围内调用的每个方法都会创建自己的SQLiteConnection对象。 现在,我在尝试在TransactionScope块中打开第二个连接时遇到了问题。 我正在小心处理所有未使用的SQLiteConnection对象,方法是将它们包装在using语句中或调用finally块中的Dispose 。 无论我做什么,第二次调用SQLiteConnection.Open时间过了一段时间, 数据库被锁定exception。 示例代码: using(var transaction = new TransactionScope(TransactionScopeOption.Required)) { using(var connection1 = new SQLiteConnection(_connectionString)) { connection1.Open(); … // Do stuff with the open connection } // Closes the connection using(var connection2 = new SQLiteConnection(_connectionString)) { // database locked exception connection2.Open(); … } } 到目前为止,我发现的所有问题都在本文中: http : //elegantcode.com/2010/07/02/using-transactionscope-with-sqlite/其中说: 即使在处理第一个连接时,TransactionScope也会保留独占的写入锁。 由于第一个连接无法完全关闭,因此打开第二个连接会导致锁定错误。 […]

“事务已在事务范围内隐式或显式提交或中止”

我在两个不同的网络上有一个Web服务器和两个DB服务器,Db1和Db2(远程数据库)。 DB1:SQL Server 2008 R2,操作系统:Windows Server 2003 SP2 DB2:SQL Server 2000,操作系统:Windows Server 2003 R2 Web服务器:Windows Server 2003 R2 我想在这些数据库中插入两个不同的记录,我正在使用TransactionScope 。 using (TransactionScope tscope = new TransactionScope(TransactionScopeOption.RequiresNew)) { //open connection db 1 //insert into db1 //open connection db2 — the problem is here //insert into db2 tscope.Complete(); } 当我跟踪源代码时,插入第一个数据库成功完成但是当第二个连接想要打开时我遇到下面的错误。 错误: 事务已被隐式或显式提交或中止。 我已经配置了MSDTC,Distributrd事务协调器,一切都还可以。 我可以在我的数据库服务器中分配事务,我没有问题。 TransactionScope什么问题? 请帮我。 LINQ […]

来自Machine.Config的maxTimeout值未被C#winform应用程序获取

我一直在使用Oracle 10g数据库的winform应用程序,它正在使用TransactionScope并想修改machine.config文件中指定的maxTimeOut值,我的machine.config文件位于以下位置(我正在使用.net 4这个应用程序) C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config 最初没有为maxTimeOut指定任何内容,因此它默认为10分钟。 为了更改它,我添加了maxTimeout=”00:00:10″值,如下所示: 我重新启动了PC并运行了一个持续时间超过此时间的测试 – 但是事务在10秒后似乎没有中止,而是使用了TransactionScopeOption参数中指定的scopeOption.TimeOut值(5分钟)并且事务超时5分钟后。 我是否已将maxTimeout值包含在上方的正确位置? 文件中是否有任何需要更改的内容? 为什么没有使用machine.config中maxTimeout的值? 谢谢

TransactionScope不回滚事务

这是我的事务范围源代码的当前体系结构。 第三个插件抛出.NETexception(不是SQLexception),它不会回滚前两个插入语句。 我做错了什么? 编辑:我从insert2和insert3中删除了try / catch。 我还从insert1 try / catch中删除了exception处理实用程序并放入“throw ex”。 它仍然不会回滚事务。 编辑2:我在Insert3方法中添加了try / catch,并在catch语句中添加了“throw”。 它仍然不会回滚事务。 更新:根据我收到的反馈,“SqlHelper”类使用SqlConnection对象建立与数据库的连接,然后创建一个SqlCommand对象,将CommandType属性设置为“StoredProcedure”并调用SqlCommand的ExecuteNonQuery方法。 我也没有将Transaction Binding = Explicit Unbind添加到当前连接字符串。 我将在下一次测试中添加它。 public void InsertStuff() { try { using(TransactionScope ts = new TransactionScope()) { //perform insert 1 using(SqlHelper sh = new SqlHelper()) { SqlParameter[] sp = { /* create parameters for first insert */ […]

什么是TransactionScope默认超时值?

当我按如下方式创建TransactionScope对象时: using (TransactionScope ts = new TransactionScope()) { // Do stuff… } 给定ts对象的默认事务超时是多少?

为什么我突然收到这个错误?

所以我有一个WCF服务,里面有一个Process()方法。 此方法从一个表中读取字节数组(文件),并基本上将该文件中的数据放入多个表中。 它只是遍历每一行。 它在生产环境中工作了一个月以来一直很好。 现在突然间,它间歇地抛出这个错误: System.InvalidOperationException:与当前连接关联的事务已完成但尚未处理。 必须先处理事务,然后才能使用连接执行SQL语句。 可能有所帮助的东西:大约两周前,我们更换了生产网络和数据库服务器。 我们搬家后,这个错误一直在呕吐。 当我们在旧服务器上时,我从未遇到过这个问题。 但问题是,这个错误在前9-10天没有发生。 现在它突然间歇地发生了。 我已经上传了大文件(1k-2.5k行)并且它们工作正常,并且这个错误会引发更小的200行文件! 并且服务有时会完美地处理相同的文件。 代码片段:(它更大,但重复类似的操作) using (var scope = new TransactionScope()) { // loop through each row/invoice foreach (var row in Rows) { Invoice invoice = (Invoice)CreateObjectWithConstantData(typeof(Invoice), doc, applicationName); invoice = (Invoice)FillObjectWithUserData(invoice, row, -1, -1, string.Empty); invoice.InvoiceNumber = InvoiceDBImpl.SaveInvoice(invoice, processFileRequest.RunId); if (invoice.InvoiceNumber == Guid.Empty) { […]

在nhibernate中缺少对环境事务的支持?

我知道NHibernate支持环境事务,因为NHibernate会话在事务范围内的环境事务中登记。 但是,有一些奇怪之处,请考虑以下测试: [Test] public void Transaction_RollsBackTransactionInsideOfAmbientTransaction_AmbientTransactionAborted() { // arrange ISessionFactory sessionFactory = SessionFactoryOneTimeInitializer.GetTestSessionFactory(); ISession session = sessionFactory.OpenSession(); SessionFactoryOneTimeInitializer.CreateDataBaseSchemaIfRequiredByConfiguration(session); using (new TransactionScope()) { using (ITransaction transaction = session.BeginTransaction()) { // act transaction.Rollback(); } // assert Assert.AreEqual(TransactionStatus.Aborted, Transaction.Current.TransactionInformation.Status); } } 此测试失败。 NHibernate将如何确保环境事务不会持久存储到数据库?

使用事务与任务并行库

我有N个进程来运行SQL Server 2008.如果任何进程失败,我需要回滚所有其他进程。 我正在考虑使用TPL创建父任务和N子任务。 所有这些都包含在transactionScope(IsolationLevel.ReadCommitted)中,但在我的下面的例子中, child2抛出一个错误(customers2不是一个有效的表),而child1没有回滚。 我在这里做错了吗? 还有其他方法来管理这种情况吗? 这是我的测试代码: 编辑我使用当前事务上的DependClone修改了如下代码。 我认为是有效的。 try { using (TransactionScope mainTransaction = TransactionUtils.CreateTransactionScope()) { var parentTransactionClone1 = Transaction.Current.DependentClone(DependentCloneOption.BlockCommitUntilComplete); var parentTransactionClone2 = Transaction.Current.DependentClone(DependentCloneOption.BlockCommitUntilComplete); var parentTask = Task.Factory.StartNew(() => { var childTask1 = Task.Factory.StartNew(() => { using (TransactionScope childScope1 = new TransactionScope(parentTransactionClone1)) { SqlConnection cnn = new SqlConnection(“Server=.\\sqlexpress;Database=northwind;Trusted_Connection=True;”); cnn.Open(); SqlCommand cmd = […]