DeepEdit!

Программирование баз данных на Oracle, техническая документация, литература, статьи и публикации

  • Увеличить размер шрифта
  • Размер шрифта по умолчанию
  • Уменьшить размер шрифта

Использование автоматической фиксации

Мое последнее слово о плохих привычках, связанных с транзакциями, касается той, что происходит от использования популярных программных интерфейсов — 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 может быть смертельным в этом случае. Я видел не одного разработчика, который, не зная об этом “средстве” автоматической фиксации, имел серьезнейшие проблемы, когда его приложение сталкивалось с ошибкой.
 









jAntivirus