Tag: 事务

如何处理TransactionInDoubtException

我有一些简单的SELECT语句和一个包含在using(TransactionScope…)块中的INSERT 。 更新:隔离级别为ReadCommited 我在调用scope.Complete()遇到以下exception。(见下文) 同时数据库完全由另一个应用程序引起高负载。 事实上我发现INSERT语句确实执行了。 我的问题是:如何以一种使数据库保持一致状态的方式处理此exception? 我正在寻找一个总是完成或未完成但从未完成一半的交易。 exception堆栈跟踪: System.Transactions.TransactionInDoubtException: The transaction is in doubt. —> System.Data.SqlClient.SqlException: Timeout expired. The timeout period elapsed prior to completion of the operation or the server is not responding. at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParserStateObject.ReadSniError(TdsParserStateObject stateObj, UInt32 error) at System.Data.SqlClient.TdsParserStateObject.ReadSni(DbAsyncResult asyncResult, TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParserStateObject.ReadNetworkPacket() […]

长时间运行的Entity Framework事务

当用户打开某个实体的编辑表单时,我想锁定该实体并让她进行任何更改。 在编辑过程中,她需要确保没有其他人对其进行任何编辑操作。 如何在entity framework(C#)4 +,数据库MS SQL Server 2008中锁定实体? 非常感谢你提前!

MySQL中的事务 – 无法回滚

我正在使用MySQL 5.0.27,并试图让交易工作。 我按照本教程: http://dev.mysql.com/doc/refman/5.0/es/connector-net-examples-mysqltransaction.html 仍然无法让这些工作。 我试图更新的表是InnoDB,并尝试执行’set autocommit = 0’但它似乎没有做任何事情….我写的代码如下: public int transactionUpdate() { MySqlConnection connection = new MySqlConnection(connStr); connection.Open(); MySqlCommand command = connection.CreateCommand(); MySqlTransaction trans; trans = connection.BeginTransaction(); command.Connection = connection; command.Transaction = trans; try { command.CommandText = “SET autocommit = 0”; command.executeNonQuery(); command.CommandText = “UPDATE TBL.rec_lang rl SET rl.lang_code = ‘en-us’ WHERE rl.recording=123456”; command.executeNonQuery(); […]

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 */ […]

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

所以我有一个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) { […]

使用mysql在C#中出现问题时,我的事务不会回滚吗?

我使用mysql connector6.2.3.0(.net)从C#连接mysql 5.1。我想一次插入3个表。所以,我正在使用事务处理。假设,当插入数据时遇到一些错误第3个表,然后事务不回滚。数据插入前两个表。 这是我的代码…… MySqlDataAdapter da = new MySqlDataAdapter(); DBUtil cUtil = new DBUtil(); MySqlConnection mysqlCon=null; MySqlTransaction txn = null; try { mysqlCon = cUtil.getDbConnection(); txn = mysqlCon.BeginTransaction(); //1 sql = “insert into test_details()”; da.InsertCommand = new MySqlCommand(sql, mysqlCon,txn); da.InsertCommand.ExecuteNonQuery(); //2 sql = “insert into task_details()”; da.InsertCommand = new MySqlCommand(sql, mysqlCon,txn); da.InsertCommand.ExecuteNonQuery(); sql = “select […]

在这种情况下如何处理sql事务?

我是C#程序员。 我想清除这个复杂的概念。 如果有2个数据库:A和B.假设我想在两个数据库中插入记录但首先在A中然后在B中插入记录。假设在插入db B时发生exception。 情况是,如果B崩溃,还应回滚与db A的事务。 我需要做什么? 我知道我可以将SqlTransaction对象与SqlConnectionString类一起使用。 我可以为此准备一些代码吗?

在SqlBulkCopy中使用NHibernate事务

我正在使用NHibernate存储一些数据,我需要插入大量数据作为此操作的一部分 – 即在同一事务中。 代码如下所示: using (ISession session = NHibernateHelper.OpenSession()) using (ITransaction transaction = session.BeginTransaction()) { session.SaveOrUpdate(something); // … SqlBulkCopy bulkCopy = new SqlBulkCopy( (SqlConnection)session.Connection, SqlBulkCopyOptions.CheckConstraints | SqlBulkCopyOptions.FireTriggers, ???transaction??? ); //… transaction.Commit(); } 我知道我可以使用TransactionScope或以其他方式使用它。 但我坚持这种模式。 让我们假装为了独立的DB访问(如果我提取并注入任意批量插入操作)。 有没有办法如何从NHibernate.ITransaction获取SqlTransaction实例? 谢谢

你能在nhibernate的一个会话中发生多个事务吗? 这是一个坏主意吗?

我正在考虑为NHibernate持久层创建自己的IUnitOfWork实现。 似乎正确的方法是在构造函数中实例化ISession和ITransaction ,然后在析构函数或Dispose()方法中进行Dispose() 。 当然,如果有人调用Save()方法,那么ISession将被刷新并且ITransaction将完成,因此在调用Save() ,将再次没有有效的打开事务来Save() …除非我提交了第一笔交易并立即开启了另一笔新交易。 但这是个好主意吗? 在设计方面,进行一次提交操作是有意义的,但我不一定能控制代码,而其他开发人员可能对遵循UnitOfWork模式不那么严格。 通过尝试使UnitOfWork容忍每个会话的多个事务,我会失去/获得任何东西吗? 我应该检查一个打开的事务,如果它已经被提交则抛出exception,而不是进行新的事务吗?

没有DTC的TransactionScope替代方案

有什么替代transactionScope不需要启用DTC ?? 在交易中,我需要做两个操作: 创建一个用户(使用成员资格–sql成员资格提供者) 做一次插入操作。