为什么连接断开后SQL事务不回滚-C#?

问题描述 投票:0回答:1

我使用的是MariaDB 10.3.21,我想知道为什么失去连接后,无法从SQL Server进行回滚。

我正在使用以下代码更新几个表。为了检查在连接断开后是否也从服务器端进行了回滚,我为objTransaction.Commit()命令设置了一个断点,并在命中它后中断了网络连接。

很遗憾,没有提交命令就接管了字段的更新。我假设如果连接丢失,服务器将执行隐式回滚。

有什么想法吗?非常感谢!

    public void ExecuteSQL(List<string> pQueryList)
    {
        using (MySqlConnection objConnection = new MySqlConnection(ConnectionString))
        {
            try
            {
                objConnection.Open();

                MySqlCommand objCommand = objConnection.CreateCommand();
                MySqlTransaction objTransaction;

                // Start Transaction
                objTransaction = objConnection.BeginTransaction();

                // Must assign both transaction object and connection
                // to Command object for a pending local transaction
                objCommand.Connection = objConnection;
                objCommand.Transaction = objTransaction;

                try
                {
                    // Set autocommit = off the this session
                    //objCommand.CommandText = "SET autocommit = 0";
                    objCommand.ExecuteNonQuery();

                    foreach (string query in pQueryList)
                    {
                        // Execute the SQL Queries
                        objCommand.CommandText = query;

                        if (objCommand.ExecuteNonQuery() <= 0)
                        {
                            throw (new Exception("Fehler bei ExecuteNonQuery. Anzahl der betroffenen Zeilen fehlerhaft."));
                        }
                    }

                    // Commit Transaction
                    objTransaction.Commit();
                }
                catch (Exception)
                {
                    for (int i = 0; i < 3; i++)
                    {
                        // Rollback 3x versuchen (falls Netzwerkverbindung abgebrochen ist)
                        try
                        {
                            objTransaction.Rollback();
                            break;
                        }
                        catch (Exception)
                        {
                            Thread.Sleep(100);
                        }
                    }                        
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Das speichern in die Datenbank ist fehlgeschlagen!\n\n" + ex.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
    }
transactions mariadb rollback
1个回答
0
投票

我认为您需要关闭“自动提交”功能,默认情况下处于启用状态。

什么是自动提交?

在每个SQL语句之后引起提交操作的设置。不建议使用此模式处理带有跨越多个语句的事务的InnoDB表。它可以帮助提高InnoDB表上的只读事务的性能,从而最大程度地减少锁定和生成撤消数据的开销,尤其是在MySQL 5.6.4及更高版本中。对于不适用事务的MyISAM表,它也适用。

(引用自https://dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_autocommit

在此处阅读有关自动提交以及如何将其关闭的信息:https://dev.mysql.com/doc/refman/5.6/en/commit.html

© www.soinside.com 2019 - 2024. All rights reserved.