Пример транзакции: выбор сведений из БД о заданном физическом лице; изменение
паспортных данных; подтверждение изменений (сохранение).
Существуют некоторые свойства, которыми должна обладать любая транзакция.
1 Атомарность (atomicity). Предполагает, что транзакция должна быть либо завершена,
либо не выполнена вовсе.
2 Непротиворечивость, постоянство (consistency). После завершения транзакции система
должна находиться в известном состоянии, т.е. транзакция не должна оставлять после себя
следов.
3 Изолированность (isolation). Транзакция должна быть изолирована, т.е. не должна
влиять на другие транзакции и зависеть от них.
4 Устойчивость, продолжительность, долговечность (durability). Если транзакция
завершена, и цель её достигнута, то не может быть никаких веских причин для её отката.
Вся выполняемая программа может рассматриваться СУБД как единая транзакция.
Завершение транзакции может быть выполнено одним из 4—х способов.
1 Ввод оператора Commit означает успешное завершение транзакции. После его
выполнения внесенные в БД изменения приобретают постоянный характер.
2 Ввод оператора Rollback означает отказ от завершения транзакции, в результате чего
выполняется откат всех изменений в БД, внесенных при выполнении этой транзакции.
3 При внедрении SQL команды в текст программы успешное окончание работы
программы автоматически вызовет завершение последней запущенной транзакции, даже если
оператор Commit не был явно введен.
4 При внедрении SQL команды в текст программы аварийное завершение этой
программы автоматически вызовет откат последней запущенной этой программой транзакции.
Уровни изоляции транзакций
Блокировки предотвращают потерю изменений при параллельной обработке данных. Но
существует ряд проблем, которые нельзя решить с помощью блокировок: «грязное чтение»,
«невоспроизводимое (неповторяемое) чтение», «фантомное чтение».
1 «Грязное чтение» (dirty reads). Одна транзакция изменяет некоторые данные, но еще не
завершается. Другая транзакция читает эти же данные (с изменениями, внесенными первой
транзакцией) и принимает на их основе какие—то решения. Первая транзакция выполняет
откат. В результате решение, принятое второй транзакцией будет основано на неверных данных.
2 «Невоспроизводимое (неповторяемое) чтение» (nonrepeatable reads). Одна транзакция
в ходе своего выполнения несколько раз читает одни и те же данные Д. Другая транзакция в
интервалах между этими чтениями изменяет данные Д и успешно заканчивается. В результате
получится, что чтения, осуществляемые первой транзакцией, дают разные результаты.
3 «Фантомное чтение» (phantoms reads). Одна транзакция в ходе своего выполнения
несколько раз выбирает множество строк по одним и тем же критериям. Другая транзакция в
интервалах между этими выборками добавляет или удаляет строки или изменяет столбцы некоторых строк, используемых в критериях выборки первой транзакции, и успешно
заканчивается. В результате получится, что одни и те же выборки в первой транзакции дают
разные множества строк.
Уровни изоляции транзакций определяют
— могут ли другие (конкурирующие транзакции) вносить изменения в данные,
изменяемые текущей транзакцией;
— может ли текущая транзакция видеть изменения, произведенные конкурирующими
транзакциями и наоборот.
1 Уровень изоляции Read Uncommetted (RU) — незавершенное, грязное чтение. Другие транзакции
блокируются по записи для этих данных до тех пор, пока не окончится текущая транзакция.
Однако другим транзакциям разрешается считывать еще не подтвержденные данные, что
классифицируется как «грязное чтение».
2 Уровень Read Commetted (RC) — чтение данных. На этом уровне запрещается грязное
чтение.
3 Repeatable Reads (RR) — воспроизводимое чтение. На этом уровне запрещается
«грязное чтение» и «невоспроизводимое (неповторяемое) чтение».
4 Serializable (S) — сериализуемость. На этом уровне запрещается «фантомное чтение».