연결이 끊긴 후 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!\n\n" + ex.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
}
}
}
자동 커밋 기능을 해제해야 할 것 같은데, 기본적으로 활성화되어 있습니다.
자동 커밋이란 무엇입니까?
각 SQL 문 다음에 커밋 작업을 발생시키는 설정입니다.이 모드는 여러 문에 걸쳐 있는 트랜잭션이 있는 InnoDB 테이블에서 작업하는 데 권장되지 않습니다.InnoDB 테이블에서 읽기 전용 트랜잭션을 수행하는 데 도움이 될 수 있으며 특히 MySQL 5.6.4 이상에서 잠금 및 실행 취소 데이터 생성에 따른 오버헤드를 최소화합니다.트랜잭션을 적용할 수 없는 My ISAM 테이블을 사용하는 경우에도 적합합니다.
(https://dev.mysql.com/doc/refman/5.6/en/glossary.html#glos_autocommit) 에서 가져온 citation.
자동 커밋 및 해제 방법에 대한 자세한 내용은 여기에서 확인하십시오. https://dev.mysql.com/doc/refman/5.6/en/commit.html
언급URL : https://stackoverflow.com/questions/60788430/why-does-sql-transaction-does-not-rollback-after-connection-is-lost-c
'programing' 카테고리의 다른 글
알파인을 기본 이미지로 사용할 때 사용자를 추가하려면 어떻게 해야 합니까? (0) | 2023.09.19 |
---|---|
이상한 MySQL "읽기 전용" 오류 (0) | 2023.09.19 |
봄이 자동으로 배선할 수 없음 맵빈 (0) | 2023.09.19 |
MySQL 스크립트 내에 스크립트 포함 (0) | 2023.09.19 |
데이터 집약적 PL/SQL 응용 프로그램을 테스트하는 방법(단위) (0) | 2023.09.19 |