Transactions 为什么SQL事务在连接丢失后不回滚-C#?

Transactions 为什么SQL事务在连接丢失后不回滚-C#?,transactions,mariadb,rollback,Transactions,Mariadb,Rollback,我使用的是MariaDB 10.3.21,我想知道为什么在连接断开后不从SQL Server执行回滚 我正在用下面的代码更新几个表。为了检查连接丢失后是否也执行了服务器端的回滚,我为objTransaction.Commit()命令设置了一个断点,点击该命令后,中断了网络连接 不幸的是,字段的更新在没有commit命令的情况下被接管。我假设如果连接丢失,服务器将执行隐式回滚 有什么想法吗?非常感谢 public void ExecuteSQL(List<string> pQu

我使用的是MariaDB 10.3.21,我想知道为什么在连接断开后不从SQL Server执行回滚

我正在用下面的代码更新几个表。为了检查连接丢失后是否也执行了服务器端的回滚,我为objTransaction.Commit()命令设置了一个断点,点击该命令后,中断了网络连接

不幸的是,字段的更新在没有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);
            }
        }
    }
public void ExecuteSQL(列表pQueryList)
{
使用(MySqlConnection objConnection=newmysqlconnection(ConnectionString))
{
尝试
{
objConnection.Open();
MySqlCommand objCommand=objConnection.CreateCommand();
MySqlTransaction-objTransaction;
//启动事务
objTransaction=objConnection.BeginTransaction();
//必须同时分配事务对象和连接
//为挂起的本地事务命令对象的步骤
objCommand.Connection=objConnection;
objCommand.Transaction=objTransaction;
尝试
{
//设置自动提交=关闭此会话的
//objCommand.CommandText=“设置自动提交=0”;
objCommand.ExecuteNonQuery();
foreach(pQueryList中的字符串查询)
{
//执行SQL查询
objCommand.CommandText=查询;

如果(objCommand.ExecuteNonQuery()我认为您需要关闭“自动提交”功能,那么它在默认情况下是启用的

什么是自动提交

在每条SQL语句后导致提交操作的一种设置。不建议使用这种模式处理包含跨多条语句的事务的InnoDB表。它可以帮助InnoDB表上的只读事务提高性能,从而最大限度地减少锁定和生成撤消数据的开销,尤其是在MySQL 5.6.4及更高版本中。它也适用于处理不适用事务的MyISAM表

(引文摘自)

阅读此处有关自动提交以及如何关闭自动提交的内容:

正如您在我的代码中看到的,我已经检查过关闭“自动提交”功能(objCommand.CommandText=“SET autocommit=0”);但这也不起作用。@Marco首先在一些SQL编辑器(如DBeaver)中手动检查它,试试不同的语法(我可以在这里看到:有多个语法),如:SET SESSION autocommit:=0;我可以解决此问题。存储引擎设置为MyISAM,不支持事务。我将其更改为InnoDB,它可以工作。(.谢谢你的SQL编辑器提示。HeidiSQL给了我关于引擎的正确提示!@Marco och,我想提及存储引擎,但后来我认为MariaDB的默认设置是InnoDB。无论如何,没问题:)