Транзакция — это последовательность операций, выполняемых как единое целое, которое либо полностью завершается успешно, либо полностью откатывается в случае ошибки. Транзакции используются для обеспечения целостности данных в базах данных, особенно в многопользовательских системах.
Connection connection = dataSource.getConnection();
connection.setAutoCommit(false); // Начало транзакции
try {
// Выполнение операций
Statement stmt = connection.createStatement();
stmt.executeUpdate("INSERT INTO users (name) VALUES ('John Doe')");
stmt.executeUpdate("UPDATE accounts SET balance = balance - 100 WHERE user_id = 1");
connection.commit(); // Завершение транзакции
} catch (SQLException e) {
connection.rollback(); // Откат транзакции в случае ошибки
} finally {
connection.setAutoCommit(true);
connection.close();
}
ACID — это набор свойств, которые гарантируют надежность и целостность данных в транзакциях. ACID расшифровывается как:
Атомарность гарантирует, что все операции в транзакции будут выполнены как единое целое. Если хотя бы одна операция не выполнится, вся транзакция будет отменена.
try {
// Начало транзакции
connection.setAutoCommit(false);
// Операции
stmt.executeUpdate("INSERT INTO users (name) VALUES ('John Doe')");
stmt.executeUpdate("UPDATE accounts SET balance = balance - 100 WHERE user_id = 1");
// Завершение транзакции
connection.commit();
} catch (SQLException e) {
// Откат транзакции
connection.rollback();
}
Согласованность гарантирует, что транзакция переводит базу данных из одного согласованного состояния в другое. Это означает, что все ограничения и правила целостности данных должны быть соблюдены.
ALTER TABLE accounts ADD CONSTRAINT chk_balance CHECK (balance >= 0);
Изолированность гарантирует, что параллельные транзакции не влияют друг на друга. Это достигается за счет использования уровней изоляции, таких как READ UNCOMMITTED
, READ COMMITTED
, REPEATABLE READ
, и SERIALIZABLE
.
connection.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
Долговечность гарантирует, что результаты успешно завершенной транзакции сохраняются в базе данных даже в случае сбоя системы.
// После успешного завершения транзакции данные сохраняются на диск
connection.commit();
Все операции, которые должны быть выполнены как единое целое, должны быть заключены в транзакцию.
Connection connection = dataSource.getConnection();
connection.setAutoCommit(false);
try {
// Операции
Statement stmt = connection.createStatement();
stmt.executeUpdate("INSERT INTO users (name) VALUES ('John Doe')");
stmt.executeUpdate("UPDATE accounts SET balance = balance - 100 WHERE user_id = 1");
connection.commit();
} catch (SQLException e) {
connection.rollback();
} finally {
connection.setAutoCommit(true);
connection.close();
}
Выбор правильного уровня изоляции помогает избежать проблем, таких как грязное чтение (dirty reads), неповторяющееся чтение (non-repeatable reads), и фантомное чтение (phantom reads).
connection.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
Ограничения целостности, такие как первичные ключи, внешние ключи и проверочные ограничения, помогают обеспечить согласованность данных.
ALTER TABLE accounts ADD CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(id);
Журналирование всех изменений в базе данных позволяет восстановить данные в случае сбоя, обеспечивая долговечность.
-- Включение журналирования
ALTER DATABASE mydb SET LOGGING ON;
Рассмотрим пример транзакции, которая переводит деньги с одного счета на другой, обеспечивая все свойства ACID.
Connection connection = dataSource.getConnection();
connection.setAutoCommit(false);
try {
// Начало транзакции
Statement stmt = connection.createStatement();
// Снятие денег с первого счета
stmt.executeUpdate("UPDATE accounts SET balance = balance - 100 WHERE user_id = 1");
// Зачисление денег на второй счет
stmt.executeUpdate("UPDATE accounts SET balance = balance + 100 WHERE user_id = 2");
// Завершение транзакции
connection.commit();
} catch (SQLException e) {
// Откат транзакции в случае ошибки
connection.rollback();
} finally {
connection.setAutoCommit(true);
connection.close();
}
Транзакция — это последовательность операций, выполняемых как единое целое, которое либо полностью завершается успешно, либо полностью откатывается. ACID свойства (атомарность, согласованность, изолированность, долговечность) гарантируют надежность и целостность данных в транзакциях. Для обеспечения ACID в БД необходимо использовать транзакции, выбирать правильные уровни изоляции, применять ограничения целостности и использовать механизмы журналирования и восстановления.