为什么 SQL 事务在连接丢失后不回滚 - C#?
Why does SQL Transaction does not Rollback after connection is lost - 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!\n\n" + ex.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
}
我认为您需要关闭 "autocommit" 功能,默认情况下它是启用的。
什么是自动提交?
A setting that causes a commit operation after each SQL statement. This mode is not recommended for working with InnoDB tables with transactions that span several statements. It can help performance for read-only transactions on InnoDB tables, where it minimizes overhead from locking and generation of undo data, especially in MySQL 5.6.4 and up. It is also appropriate for working with MyISAM tables, where transactions are not applicable.
(引自https://dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_autocommit)
在此处阅读有关自动提交以及如何将其关闭的信息:
https://dev.mysql.com/doc/refman/5.6/en/commit.html
我正在使用 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);
}
}
}
我认为您需要关闭 "autocommit" 功能,默认情况下它是启用的。
什么是自动提交?
A setting that causes a commit operation after each SQL statement. This mode is not recommended for working with InnoDB tables with transactions that span several statements. It can help performance for read-only transactions on InnoDB tables, where it minimizes overhead from locking and generation of undo data, especially in MySQL 5.6.4 and up. It is also appropriate for working with MyISAM tables, where transactions are not applicable.
(引自https://dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_autocommit)
在此处阅读有关自动提交以及如何将其关闭的信息: https://dev.mysql.com/doc/refman/5.6/en/commit.html