我使用的是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);
}
}
}
我认为您需要关闭“自动提交”功能,默认情况下处于启用状态。
什么是自动提交?
在每个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