Обеспечение целостности данных. Управление транзакциями в СУБД Oracle и SQL Server, страница 2

SQL> UPDATE sample SET comm=100 WHERE comm IS NULL;

SQL> COMMIT;

SQL> SELECT * FROM sample;

ENAME           COMM

---------- ---------

ADAMS            100

STONE            100

Отклонение транзакции

Отклонить незафиксированные изменения можно с помощью команды ROLLBACK. В результате выполнения этой команды:

·  восстанавливается прежнее состояние данных, все изменения теряются;

·  все пользователи видят данные такими, какими они были до начала транзакции;

·  снимается блокировка с изменяемых строк, другие пользователи получают возможность вносить в них изменения;

·  удаляются все точки сохранения

SQL> SELECT * FROM sample;

ENAME           COMM

---------- ---------

ADAMS

FORD

SQL> DELETE FROM sample WHERE ename='FORD';

SQL> INSERT INTO sample (ename) VALUES ('STONE');

SQL> UPDATE sample SET comm=100 WHERE comm IS NULL;

SQL> ROLLBACK;

SQL> SELECT * FROM sample;

ENAME           COMM

---------- ---------

ADAMS

FORD

Отклонение транзакции до точки сохранения

С помощью команды SAVEPOINT Вы можете разбить транзакцию на более мелкие единицы, создав точки сохранения во время выполнения транзакции. После этого Вы сможете отвергнуть транзакцию или полностью, или до определенной точки сохранения, выполнив команду ROLLBACK TO точка_сохранения. Таким образом, Вы можете создать несколько точек сохранения с разными именами и отвергнуть транзакцию до любой из этих точек. Если Вы создаете две точки сохранения с одним и тем же именем, первая точка сохранения с таким именем будет удалена.

Если при выполнении транзакции возникла ошибка в одной команде DML, будет отменен только результат этой команды, изменения, сделанные другими командами обработки данных сохранятся и могут быть приняты (COMMIT) или отвергнуты (ROLLBACK).

SQL> SELECT * FROM sample;

ENAME           COMM

---------- ---------

ADAMS

FORD

SQL> DELETE FROM sample WHERE ename='FORD';

SQL> SAVEPOINT sp1;

SQL> INSERT INTO sample (ename) VALUES ('STONE');

SQL> SAVEPOINT sp2;

SQL> UPDATE sample SET comm=100 WHERE comm IS NULL;

SQL> ROLLBACK TO sp2;

SQL> COMMIT;

SQL> SELECT * FROM sample;

ENAME           COMM

---------- ---------

ADAMS

STONE

Управление транзакциями в СУБД SQL Server

Начало транзакции

Транзакция в SQL Server может начинаться явно, неявно или в режиме autocommit (режим по умолчанию).

·  В режиме явных транзакций (explicit transactions) транзакция начинается с предложения BEGIN TRANSACTION.

·  В режиме autocommit подтверждается каждое успешное утверждение Transact-SQL. В этом режиме нет необходимости явно использовать команды начала и завершения транзакции.

·  Предложение SET IMPLICIT_TRANSACTIONS ON инициализирует режим неявных транзакций (implicit transactions). Следующее предложение автоматически начинает новую транзакцию. После того, как транзакция будет завершена, следующее утверждение Transact-SQL начнет новую транзакцию.

Завершение транзакции

Транзакция явно завершается предложением:

·  COMMIT [{TRANSACTION | WORK}] – подтверждение транзакции. Все изменения данных становятся постоянными. Освобождаются ресурсы, занимаемые транзакцией, такие, как блокировки.

·  ROLLBACK [{TRANSACTION | WORK}] – отмена транзакции. Все изменения откатываются, данные принимают состояние, которое они имели на начало транзакции. Освобождаются ресурсы, занимаемые транзакцией.

SQL Server автоматически откатывает транзакцию и освобождает занимаемые данной транзакцией ресурсы если:

·  во время выполнения транзакции произошла серверная ошибка;

·  завершится (аварийно или успешно) клиентское приложение или сеанс, выполняющий транзакцию;

Изоляция транзакций

При выполнении транзакций могут происходить следующие нежелательные процессы:

·  Грязное чтение (Dirty reads) – транзакция видит данные, которые были изменены, но не подтверждены другой транзакцией

·  Нерегулярное чтение (Nonrepeatable reads) – транзакция читает данные, которые она уже читала, и обнаруживает, что другая подтвержденная транзакция изменила или удалила эти данные

·  Фантомное чтение (Phantom reads) – транзакция заново выполняет запрос, возвращающий множество строк, удовлетворяющих некоторому поисковому критерию, и обнаруживает новые строки, добавленные другой подтвержденной транзакцией, удовлетворяющие этому условию.

Стандарт SQL2 описывает четыре уровня изоляции транзакций в зависимости от того, какие из перечисленных выше явлений они допускают.

Уровень изоляции

Грязное чтение

Нерегулярное чтение

Фантомное чтение

Описание

Неподтвержденное чтение

Read uncommitted

Допускается

Допускается

Допускается

Возможно чтение неподтвержденных данных

Подтвержденное чтение

Read committed

Не допускается

Допускается

Допускается

Транзакция не может читать данные, не подтвержденные другой транзакцией

Регулярное чтение

Repeatable read

Не допускается

Не допускается

Допускается

Блокировка помещается на все строки, используемые в транзакции; другие транзакции не могут изменять эти данные, но могут добавлять новые строки.

Сериализованный

Serializable

Не допускается

Не допускается

Не допускается

Блокировка помещается на множество данных; другие транзакции не могут добавлять или обновлять строки в данном множестве.