MySQL Транзакции: не фиксировать в базе данных, если метод не может вернуть определенный результат - PullRequest
0 голосов
/ 28 апреля 2020

Я создаю программу управления файлами, и я хотел бы зафиксировать информацию только о конкретном файле, и только если этот файл был перемещен в указанное c местоположение. Все по соображениям безопасности.

Лог c выглядит следующим образом:

NewTransaction newTransaction = connector.insertfileDataToDatabase(fileData, connection);
                if (newTransaction!= null) {

// Только если этот метод SUCCESSFUL:

   bool success = this.entryProvider.moveToFinalLocation(this.targetPath);
                    if (success) { newTransaction.commit();
                    } else { newTransaction.rollback();
                           }
                            }

Класс соединителя базы данных:

public NewTransaction insertfileDataToDatabase(FileData fileData, DatabaseConnectionDetails connectionDetails) {
            GenericDatabaseAccess.Util.SqlQueryBuilder builder = new GenericDatabaseAccess.Util.SqlQueryBuilder();
            MySqlConnection connection;
            MySqlTransaction transaction;
            try {
                connection = new MySqlConnection(connectionDetails.getConnectionString());
                connection.Open();
                MySqlCommand cmd = connection.CreateCommand();
                cmd.Connection = connection;
                transaction = connection.BeginTransaction();
                cmd.Transaction = transaction;
                cmd.CommandText = "INSERT INTO table()" +
                    " VALUES (\""+ somedata + "\");";
                    cmd.ExecuteNonQuery();
                    NewTransaction newTransaction = new NewTransaction(connection, transaction);                                     
                    return newTransaction;
                } 
            } catch (MySqlException e) {
                    return null;
            }
        }

И, наконец, я использую отдельный класс NewTransaction:

public class NewTransaction {
            private MySqlConnection connection;
            private MySqlTransaction transaction;

            public NewTransaction(MySqlConnection connection, MySqlTransaction transaction) {
                this.connection = connection;
                this.transaction = transaction;
            }

            public void commit() {
                try {
                    transaction.Commit();

                } catch (MySqlException e) {

                } finally {
                    if (connection != null) {
                        connection.Close();
                        connection.Dispose();
                    }
                }
            }

            public void rollback() {
                try {
                    transaction.Rollback();

                } catch (MySqlException e) {

                } finally {
                    if (connection != null) {
                        connection.Close();
                        connection.Dispose();
                    }
                }
            }
        }

Я застрял на этом этапе, и любая помощь или совет о том, как правильно реализовать эту функциональность, будет очень цениться!

PS Это более теоретический вопрос о том, как работают транзакции и могут ли они работать в данном конкретном случае. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...