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 используется для отчётности, т.к. запись может быть прочитана несколько раз, и всегда будет получено одно и то же значение, пока эта транзакция сама не внесёт изменения. Он не рекомендуется для интерактивных пользователей, т.к. они нуждаются в своевременных данных.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.