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

Example 1:

1я сессия, уровень изоляции RW Table Stability:

SELECT film.name, website.url FROM film, website WHERE film.site = website.s_id;

Результат:

NAME                                                                                              URL

The Terminator 2: Judgment Day                                         http://www.film.com

The Lord of the Rings: The Fellowship of the Ring             http://www.lordoftherings.net

The Lord of the Rings: The Two Towers                             http://www.lordoftherings.net

Titanic                                                                                   http://www.titanicmovie.com

Avatar                                                                                   http://www.imdb.com

2я сессия, уровень изоляции Read Committed:

UPDATE website SET URL = 'http://www.kinopoisk.com' WHERE S_ID =1;

Результат 2 сессии – ошибка:

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

lock conflict on no wait transaction.

3я сессия, уровень изоляции Read Committed:

SELECT film.name, website.url FROM film, website WHERE film.site = website.s_id and website.s_id = 1;

Результат 3 сессии:

NAME                                                           URL

The Terminator 2: Judgment Day      http://www.film.com

Example 2:

1я сессия, уровень изоляции RO Table Stability:

UPDATE website SET URL = 'http://www.kinopoisk.com' WHERE S_ID =1;

Результат 1 сессии – сообщение:

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

attempted update during read-only transaction.

Example 3: (нельзя читать, когда пишут в таблицу)

1я сессия, уровень изоляции RW Table Stability:

UPDATE website SET URL = 'http://www.kinopoisk.com' WHERE S_ID =1;

2я сессия, уровень изоляции RO Table Stability или RW Table Stability:

SELECT film.name, website.url FROM film, website WHERE film.site = website.s_id;

Результат 2 сессии – ошибка:

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

lock conflict on no wait transaction.

Если у 2й сессии будет уровень изоляции Read Committed или Snapshot, то результат 2 сессии:

NAME                                                           URL

The Terminator 2: Judgment Day      http://www.film.com

И только после того, как 1я сессия будет подтверждена, результат 2й сессии будет:

NAME                                                           URL

The Terminator 2: Judgment Day      http://www.kinopoisk.com

Example 4: (две сессии пишут в таблицу)

1я сессия, уровень изоляции RW Table Stability:

UPDATE website SET URL = 'http://www.kinopoisk.com' WHERE S_ID =1;

2я сессия (любой уровень изоляции):

UPDATE website SET URL = 'http://www.kinopoisk.com' WHERE S_ID =5;

До подтверждения 1й сессии, в результате выполнения 2й сессии выдаётся сообщение:

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

lock conflict on no wait transaction.

3.4.Выводы

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

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

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