Автор работы: Пользователь скрыл имя, 21 Ноября 2010 в 13:18, Не определен
Целью данной работы является рассмотрение технологии работы с транзакциями, а так же работу транзакций в Microsoft SQL Server 2000
2. Транзакции в Microsoft SQL Server 2000
Существует три типа поведения параллельно выполняемых транзакций:
В таблице 2.1 приводится список типов поведения, которые допускаются на каждом уровне изолированности. Как можно видеть из таблицы, уровень read uncommitted является наименее ограничивающим уровнем изолированности, а serializable – наиболее ограничивающим. Как уже отмечалось, read committed является в SQL Server принятым по умолчанию уровнем изолированности. По мере роста уровня изолированности SQL Server налагает все более ограничивающую блокировку на все более длительные периоды времени. И, как отмечалось, уровень изолированности влияет на блокирующее поведение операторов SELECT, а это означает, что изолированность влияет на режим блокировки, применяемый к читаемым данным.
Таблица
2.1 - Поведение при различных
Допустимое поведение | Чтение нефиксированных данных | Неповторяемое чтение | Фантомное чтение |
Read uncommitted | Да | Да | Да |
Read committed | Нет | Да | Да |
Repeatable read | Нет | Нет | Да |
Serializable | Нет | Нет | Нет |
Можно задать уровень изолированности, который будет использоваться для всего сеанса пользователя SQL Server, с помощью операторов Transact-SQL (T-SQL) или с помощью функций в вашем приложении. Можно также задать в запросе подсказку блокировки, чтобы переопределить уровень изолированности для данной транзакции. Подсказки блокировки приводятся в секции "Подсказки блокировки". Чтобы задать уровень изолированности с помощью T-SQL или в приложении DB-LIB, используя оператор SET TRANSACTION ISOLATION LEVEL и одного из четырех уровней изолированности. Используется следующий синтаксис:
SET TRANSACTION ISOLATION LEVEL
READ UNCOMMITTED
| READ COMMITTED
| REPEATABLE READ
| SERIALIZABLE GO
После того как задали определенный уровень изолированности для сеанса, все последующие транзакции в этом сеансе SQL Server будут осуществлять блокировку, обеспечивающую этот уровень изолированности. Чтобы определить, какой уровень изолированности SQL Server применяется в данный момент по умолчанию, используйте команду DBCC USEROPTIONS. Нужно указать имя данной команды:
DBCC USEROPTIONS
Эта команда возвращает в результате только те параметры, которые задал пользователь или которые являются активными. Если не задан уровень изолированности (оставив принятый по умолчанию уровень SQL Server), то не увидите этот уровень, запустив оператор DBCC USEROPTIONS. Но если был задан уровень, отличный от принятого по умолчанию, то увидите этот уровень изолированности. Например, если выполнить следующие операторы, то уровень изолированности будет показан в результатах оператора DBCC USEROPTIONS:
USE pubs
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
GO
DBCC USEROPTIONS
GO
Результаты оператора DBCC USEROPTIONS будут выведены в следующей форме:
Set Option Value
-------------------------
textsize 64512
language us_english
dateformat mdy
datefirst 7
quoted_identifier SET
arithabort SET
ansi_null_dflt_on SET
ansi_defaults SET
ansi_warnings SET
ansi_padding SET
ansi_nulls SET
concat_null_yields_null SET
isolation level serializable
(13 row(s) affected)
Для
замещения принятого по умолчанию
уровня изолированности можно
Транзакция может начинаться в одном из трех режимов: автофиксация (autocommit), явный режим (explicit) или неявный режим (implicit). По умолчанию для SQL Server принят режим автофиксации.
Для согласованности информации в базе данных нужно, чтобы были завершены все эти шаги или не был завершен ни один из этих шагов. Для этой цели сгруппируем все операторы, управляющие данной задачей, в одну явную транзакцию. Если эти операторы не будут объединены в одну группу, это может привести к несогласованному состоянию данных.
Использование явных транзакций, когда задача состоит из нескольких шагов, также дает преимущества, поскольку SQL Server (независимо от использования операторов ROLLBACK) автоматически выполнит откат транзакций в случае серьезных ошибок, таких как обрыв связи в сети, аварийный сбой (базы данных или клиентской системы) или взаимоблокировка. Для запуска транзакции используется оператор T-SQL BEGIN TRANSACTION. Чтобы указать конец транзакции, используется COMMIT TRANSACTION или ROLLBACK TRANSACTION. В операторе BEGIN TRANSACTION можно дополнительно указать имя транзакции и затем ссылаться на эту транзакцию по имени в операторе COMMIT TRANSACTION или ROLLBACK TRANSACTION.
Если
один из этих операторов используется,
чтобы начать неявную транзакцию,
эта транзакция продолжается, пока
не будет явно указано ее окончание, даже
если внутри транзакции снова встретятся
эти операторы. После явного фиксирования
или отката данной транзакции следующее
появление этих операторов является началом
новой транзакции. Этот процесс продолжает
действовать, пока не будет отключен неявный
режим.
Фиксированной называется транзакция, все модификации которой стали постоянной частью базы данных. До фиксирования транзакции запись о ее модификациях и запись ее фиксирования заносятся в журнал транзакций базы данных. Таким образом, модификации, которые становятся постоянной частью базы данных, могут находиться в одном из двух мест: либо они фактически записываются на диск и, тем самым, оказываются в базе данных, либо они находятся в кэше данных, что позволяет в случае сбоя выполнить повтор транзакции с помощью журнала транзакций, чтобы избежать потери данной транзакции.
Все ресурсы, используемые транзакцией, такие как блокировки, освобождаются после фиксирования данной транзакции. Фиксирование транзакции считается успешным в случае успешного завершения каждого из ее операторов. Ниже приводится небольшая транзакция с именем update_state, которая изменяет в таблице publishers (издатели) значение колонки state на XX для всех издателей, у которых в этой колонке содержится значение NULL:
USE pubs
GO
BEGIN TRAN update_state
UPDATE publishers SET state = 'XX'
WHERE state IS NULL
COMMIT TRAN update_state
GO
Запустив эту транзакцию, можно увидеть, что это повлияло на две строки. Чтобы вернуть таблицу к ее исходному состоянию (как если бы вместо фиксирования произошел откат), необходимо выполнить следующую транзакцию:
USE pubs
GO
BEGIN TRAN undo_update_state
UPDATE publishers SET state = NULL
WHERE state = 'XX'
COMMIT TRAN undo_update_state
GO
Это повлияло на две строки. Имена транзакций update_state (модифицировать_состояние) и undo_update_state (отменить _ модификацию _ состояния), используемые в операторе COMMIT TRAN, игнорируются в SQL Server: имена транзакций используются просто для удобства программиста, чтобы можно было указать имя фиксируемой транзакции. SQL Server автоматически фиксирует последнюю нефиксированную транзакцию, запущенную перед фиксированием, независимо от указания имени транзакции.[9 - 11]