programing

연결이 끊긴 후 SQL 트랜잭션이 롤백되지 않는 이유 - C#?

instargram 2023. 9. 19. 20:46
반응형

연결이 끊긴 후 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

반응형