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



我使用的是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!nn" + ex.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
}

我认为您需要关闭"自动提交"功能,它是默认启用的。

什么是自动提交?

在每个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

最新更新