Транзакции

Транзакция. Действие или ряд действий, выполняемых одним пользователем или прикладной программой, которые осуществляют чтение или изменение содержимого базы данных.

Транзакция является логической единицей работы, выполняемой в базе данных. Она может быть представлена отдельной программой, частью программы или даже отдельной командой (например, командой INSERT или UPDATE языка SQL) и включать произвольное количество операций, выполняемых в базе данных. С точки зрения администратора базы данных эксплуатация любого приложения может расцениваться как ряд транзакций, в промежутках между которыми выполняется обработка данных, осуществляемая вне среды базы данных. Для иллюстрации понятия транзакции рассмотрим два отношения:

Staff (staffNo, fName, IName, position, sex, DOB, salary, branchNo) PropertyForRent (propertyNo, street, city, postcode, type, rooms, rent, ownerNo, staffNo, branchNo)

Простейшей транзакцией, выполняемой в подобной базе данных, может быть корректировка зарплаты определенного работника, указанного его табельным номером х. Обобщенно подобная транзакция может быть записана, как показано в таблице (вариант А). В этой главе мы будем обозначать операции чтения или записи элемента данных х с помощью выражений read(x) и write(х). При необходимости к имени элемента данных могут добавляться дополнительные уточнители. Например, в столбце Вариант А используется обозначение read (staffNo = х, salary), указывающее, что требуется считать элемент данных salary для записи, в которой ключевое значение равно х. В данном примере транзакция состоит из двух операций, выполняемых в базе данных (read и write), и одной операции, выполняемой вне базы данных (salary = salary*1. 1).

Вариант А Вариант Б
read(staffNo = x, salary) salary = salary * 1.1 write (staffNo = x, new_salary) delete(staffNo = х) for all PropertyForRent records, pno begin read(propertyNo = pno, staffNo) if (staffNo = x) then begin staffNo = newStaffNo write(propertyNo = pno, staffNo) end end

Более сложная транзакция, текст которой также показан в таблице (вариант Б), предназначена для удаления сведений о работнике, заданном его табельным номером х. В этом случае, помимо удаления соответствующей строки из отношения Staff, требуется найти все строки отношения PropertyForRent, описывающие объекты недвижимости, за которые отвечал данный работник, после чего назначить их некоторому другому работнику, табельный номер которого, предположим, имеет значение newStaffNo. Если все указанные изменения не будут внесены до конца, правила ссылочной целостности будут нарушены и база данных окажется в несогласованном состоянии — за объект недвижимости будет отвечать несуществующий сотрудник компании.

Любая транзакция всегда должна переводить базу данных из одного согласованного состояния в другое, хотя допускается, что согласованность состояния базы может нарушаться в ходе выполнения транзакции. Например, в процессе выполнения транзакции, представленной в столбце Вариант Б таблицы, возникает ситуация, когда одна из строк отношения PropertyForRent содержит новое значение атрибута staffNo — newStaffNo, тогда как остальные строки все еще содержат прежнее значение х. Однако после завершения выполнения транзакции во все требуемые строки должно быть помещено новое значение — newStaffNo.

Любая транзакция завершается одним из двух возможных способов. В случае успешного завершения результаты транзакции фиксируются (commit) в базе данных, и последняя переходит в новое согласованное состояние. Если выполнение транзакции не увенчалось успехом, она отменяется. В этом случае в базе данных должно быть восстановлено то согласованное состояние, в котором она находилась до начала данной транзакции. Этот процесс называется откатом (roll back), или отменой транзакции. Зафиксированная транзакция не может быть отменена. Если окажется, что зафиксированная транзакция была ошибочной, потребуется выполнить другую транзакцию, отменяющую действия, выполненные первой транзакцией. Такая транзакция называется компенсирующей. Но аварийно завершившаяся транзакция, для которой выполнен откат, может быть вызвана на выполнение позже и, в зависимости от причин предыдущего отказа, вполне успешно завершена и зафиксирована в базе данных.

Ни в одной СУБД не может быть предусмотрен априорный способ определения того, какие именно операции обновления могут быть сгруппированы для формирования единой логической транзакции. Поэтому должен применяться метод, позволяющий указывать границы каждой из транзакций извне, со стороны пользователя. В большинстве языков манипулирования данными для указания границ отдельных транзакций используются операторы BEGIN TRANSACTION, COMMIT и ROLLBACK (или их эквиваленты). Если эти ограничители не были использованы, как единая транзакция обычно рассматривается вся выполняемая программа. СУБД автоматически выполнит команду COMMIT при нормальном завершении этой программы. Аналогично, в случае аварийного завершения программы в базе данных автоматически будет выполнена команда ROLLBACK.

Порядок выполнения операций транзакции принято обозначать с помощью диаграммы переходов. Пример такой диаграммы приведен на рисунке. Следует отметить, что на этой диаграмме, кроме очевидных состояний ACTIVE, COMMITTED и ABORTED, имеются еще два состояния, описанные ниже.

  • PARTIALLY COMMITTED.

Это состояние возникает после выполнения последнего оператора. В этот момент может быть обнаружено, что в результате выполнения транзакции нарушены правила упорядочения или ограничения целостности, поэтому транзакцию необходимо завершить аварийно. Еще один вариант развития событий состоит в том, что в системе происходит отказ и все данные, обновленные в транзакции, невозможно успешно записать во внешнюю память. В подобных случаях транзакция должна перейти в состояние FAILED и завершиться аварийно. А если транзакция выполнена успешно, то все результаты обновления могут быть надежно записаны во внешней памяти и транзакция может перейти в состояние COMMITTED.

  • FAILED.

Такое состояние возникает, если транзакция не может быть зафиксирована или произошло ее аварийное завершение, когда она находилась в состоянии ACTIVE, Это аварийное завершение могло возникнуть из-за отмены транзакции пользователем или в результате действия протокола управления параллельным доступом, вызвавшего аварийное завершение транзакции для обеспечения упорядочиваемости операций базы данных.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: