Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции.docx
Скачиваний:
44
Добавлен:
18.02.2016
Размер:
364.62 Кб
Скачать

Уровни изолированности транзакций

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

InterBase имеет три уровня изолированности:

READ COMMITTED - Читать подтвержденные данные. Этот уровень изоляции позволяет транзакции видеть изменения, сделанные другими, транзакциями, если эти изменения были подтверждены. К примеру, стартовали транзакции Т1 и Т2. Обе они изменили запись. Однако Т1 не увидит изменений, сделанных Т2, пока та не подтвердит сделанных ей изменений (поCommit ). Этот уровень изоляции считается самым низким, открытым, позволяя транзакции видеть "самые свежие" данные.

SNAPSHOT - Моментальный снимок данных. Это средний уровень изолированности. Он позволяет транзакции видеть только те данные, которые существовали в момент старта транзакции. Если другие заинтересованные транзакции изменили запись и подтвердили изменения, то SNAPSHOT - транзакция все равно не увидит этих изменений. Однако она не блокирует данные, с которыми работает.

SNAPSHOT TABLE STABILITY - еще более закрытый уровень изоляции. Транзакции такого уровня не только делают снимок данных, они также блокируют на запись те данные, с которыми работают. Пока такая транзакция не подтверждена, остальные транзакции гарантированно не смогут изменить эти данные. Кроме того, транзакция SNAPSHOT TABLE STABILITY просто не сможет получить доступ к таблице, если в настоящий момент другая транзакция изменяет в ней данные.

Параметры транзакций

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

Таблица 24.1. Возможные параметры транзакций

Параметр

Описание

Read

Разрешается чтение данных.

Write

Разрешается запись данных.

Wait

При возникновении конфликта с другой транзакцией, текущая транзакция ожидает определенное время (по умолчанию, 10 сек.), прежде чем попытается решить этот конфликт.

NoWait

При возникновении конфликта с другой транзакцией сразу генерируется ошибка.

Read_committed Rec_Version

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

Read_committed No_Rec_Vesion

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

Concurrency

Создает уровень изоляции SNAPSHOT.

Consistency

Создает уровень изоляции SNAPSHOT TABLE STABILITY

Программист может задать транзакции несколько параметров одновременно. Например, если нужно, чтобы транзакция могла и читать, и изменять данные, можно задать параметры

Read

Write

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

Если транзакция используется только для чтения, например, для вывода данных в сетку запросом SELECT, то она должна иметь параметры, позволяющие только читать данные, что значительно ускорит работу транзакции. Причем данные должны быть самыми "свежими", даже из неподтвержденных транзакций. И, кроме того, транзакция не должна ожидать разрешения возможного конфликта. Набор параметров тут может быть следующим:

Read

Read_Committed

Rec_Version

NoWait

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

Read

Concurrency

NoWait

И, наконец, если транзакция предназначена для изменения данных в БД, то ей лучше задать более жесткие параметры, например:

Write

Concurrency

NoWait