Многие разработчики имеют плохие привычки при обращении с транзакциями. Я часто это замечаю у разработчиков, имеющих дело с базами данных, которые “поддерживают”, но не “стимулируют” применение транзакций. Например, в Informix (по умолчанию), Sybase и SQL Server, вы должны явно начинать транзакцию словом BEGIN; в противном случае каждый индивидуальный оператор сам по себе представляет отдельную транзакцию. В манере, подобной способу, которым Oracle “обертывает” SAVEPOINT вокруг дискретных операторов, эти базы данных обертывают каждый оператор парами BEGIN WORK/COMMIT или ROLLBACK. Это объясняется тем, что в этих базах данных блокировки — ценный ресурс, потому читатели блокируют писателей и наоборот. Пытаясь повысить степень параллелизма, упомянутые базы данных стимулируют вас делать транзакции насколько возможно, краткими — иногда даже за счет целостности данных.
СУБД Oracle исповедует противоположный подход. Транзакции всегда неявны, и нет способа включить “автоматическую фиксацию” (“autocommit”), если только приложение не реализует ее (подробнее об этом читайте в разделе “Использование автоматической фиксации”). В Oracle каждая транзакция должна быть зафиксирована, когда нужно, но никогда раньше. Транзакции могут быть настолько крупными, насколько это необходимо. Такие вещи, как блокировки и тому подобное, не должны рассматриваться в качестве определяющих факторов, диктующих размер транзакции; целостность данных — вот движущий фактор, влияющий на размер вашей транзакции. Блокировки не являются ограниченным ресурсом, и нет зависимостей между параллельно работающими читателями и писателями данных.
Это позволяет вам иметь устойчивые транзакции в базе данных. Такие транзакции не обязаны быть краткими — они могут быть настолько длинными, насколько это необходимо (но не больше). Транзакции — не средство достижения согласия между компьютером и его программным обеспечением; они предназначены для того, чтобы защитить ваши данные.
| < Предыдущая | Следующая > |
|---|


