Мое последнее слово о плохих привычках, связанных с транзакциями, касается той, что происходит от использования популярных программных интерфейсов — ODBS и JDBC. Эти API выполняют автоматическую фиксацию (“autocommit”) по умолчанию. Рассмотрим следующие операторы, которые переводят сумму $1000 с расчетного счета на сберегательный счет:
update accounts set balance = balance - 1000 where account_id = 123;
update accounts set balance = balance + 1000 where account_id = 456;
Если ваша программа использует JDBC, когда вы посылаете эти запросы, то JDBC (молча) выполняет фиксацию после каждого оператора UPDATE. Представьте последствия этого, если система даст сбой после первого UPDATE и перед вторым. Вы потеряете $1000!
Я могу понять, почему ODBC так поступает. ODBC проектировали разработчики SQL Server, а эта база данных требует, чтобы вы применяли очень короткие транзакции из-за используемой там модели параллелизма (запись блокирует чтение, чтение блокирует запись, а блокировки — ограниченный ресурс). Чего я не могу понять — так это почему подобное попало в JDBC — API, претендующий на поддержку систем уровня предприятия. Поэтому я уверен в том, что первой строкой кода после открытия соединения в JDBC всегда должна быть следующая:
connection conn = DriverManager.getConnection
("jdbc:oracle:oci:@database","scott","tiger");
conn.setAutoCommit (false);
Это вернет управление транзакциями вам, то есть разработчику, которому оно и должно принадлежать. Затем вы сможете безопасно кодировать транзакцию перевода денег с одного счета на другой и фиксировать ее после того, как оба оператора успешно завершатся. Недостаток знаний о вашем API может быть смертельным в этом случае. Я видел не одного разработчика, который, не зная об этом “средстве” автоматической фиксации, имел серьезнейшие проблемы, когда его приложение сталкивалось с ошибкой.
< Предыдущая | Следующая > |
---|