Базы данных SQL-DDL и SQL-DML. Изучение транзакций. Программирование на языке SQL. Консольное приложение (Цикл лабораторных работ). Вариант № 1, страница 18

Изменения, произведенные второй транзакцией, не влияют на состояние базы данных для первой транзакции. При таком подходе возникает проблема одновременного изменения одних и тех же данных несколькими транзакциями. Какой результат будет принят?

Пример:

UPDATE people SET name=’Изиклайтус К.А.’ WHERE id=3;

Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.

lock conflict on no wait transaction.

deadlock.

update conflicts with concurrent update.

concurrent transaction number is 5953.

Т.е. можно сделать вывод, что пока одна из транзакций не завершила изменение, остальные транзакции не в состоянии изменить те же данные.

3) Snapshot table stability.

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

Для данного вида транзакции в среде IBExpert существует два режима:

Read Only – транзакция разрешает только операции чтения;

Read Write - транзакция разрешает операции чтения и записи.

Пример:

1-ый запрос, RW Table Stability:

select address.str, people.name from people,address,address_link where address_link.person_id=people.id

2-ой запрос, Read Committed:

update people set id  = 'Степаненко О. Л.' where client_id = 1


3-ий запрос, Read Committed:

select id from people where id = 1

Для первой транзакции режимы Read Only или Read Write не влияют на результат транзакции, т.к. в этой транзакции происходит считывание данных.

При использовании режима Read Only для второй транзакции выдается следующая ошибка:

The INSERT, UPDATE, DELETE, DDL or authorization statement cannot be executed because the transaction is inquiry only.

attempted update during read-only transaction.

При использовании режима Read Write для второй транзакции выдается следующая ошибка:

Unsuccessful execution caused by system error that does not preclude successful execution of subsequent statements.

lock conflict on no wait transaction.

После запроса на чтение в транзакции 1, таблица person блокируется, изменения этой таблицы в траназакции 2 уже невозможны. Причем, уже неважно, какой тип транзакции используется в транзакции 2 – таблица person заблокирована первой транзакцией.

3.4.Выводы

В результате работы были изучены основные принципы работы транзакций, проведены эксперименты по запуску, подтверждению и откату транзакций.

Существует 4 уровня изоляции, но Firebird  не поддерживает Read uncommitted (грязное чтение).  Read committed используется по умолчанию и вполне подходит для интерактивных пользователей. Из опыта видно, что при таком уровне изоляции вполне возможно нарушить целостность БД, а в случае исключения вызвать конфликт, если оба запроса попытаются получить доступ к одному и тому же ресурсу.

Уровень изоляции snapshot дает нам мгновенный снимок базы данных на момент старта транзакции, этот снимок не может быть изменен другими параллельными транзакциями. Чтобы увидеть во второй программе изменения, выполненные другими транзакциями, следует остановить транзакцию, заново ее запустить и открыть набор данных. Метод Snapshot используется для отчётности, т.к. запись может быть прочитана несколько раз, и всегда будет получено одно и то же значение, пока эта транзакция сама не внесёт изменения. Он не рекомендуется для интерактивных пользователей, т.к. они нуждаются в своевременных данных.