Я создаю программу управления файлами, и я хотел бы зафиксировать информацию только о конкретном файле, и только если этот файл был перемещен в указанное 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 Это более теоретический вопрос о том, как работают транзакции и могут ли они работать в данном конкретном случае. :)