Понятие транзакции

Автор работы: Пользователь скрыл имя, 21 Ноября 2010 в 13:18, Не определен

Описание работы

Целью данной работы является рассмотрение технологии работы с транзакциями, а так же работу транзакций в Microsoft SQL Server 2000

Файлы: 3 файла

крсовая по транзакциямгот.doc

— 772.00 Кб (Скачать файл)

Курсовик Транзакции.doc

— 673.00 Кб (Скачать файл)
"justify">     Самый низкий уровень изолированности  называется уровнем неподтвержденного, или грязного, чтения. Он обозначается как READ UNCOMMITED. При этом уровне изолированности текущая транзакция видит промежуточные и несогласованные данные, и также ей доступны строки-призраки.  

     2. Транзакции в Microsoft SQL Server 2000

     2.1 Поведение параллельных транзакций в Microsoft SQL Server

 

     Существует  три типа поведения параллельно  выполняемых транзакций:

  1. Чтение нефиксированных данных (Dirty read). Чтение, при котором происходит считывание еще не фиксированных данных. Чтение нефиксированных данных возникает в том случае, когда одна транзакция модифицирует данные, а вторая транзакция читает эти модифицированные данные до того, как зафиксированы изменения, внесенные в первой транзакции. В случае отката первой транзакции вторая транзакция получит данные, которых нет в базе данных.
  2. Неповторяемое чтение (Nonrepeatable read). Несогласующиеся результаты, получаемые при повторном чтении. Неповторяемое чтение возникает в случае, когда чтение одной строки данных происходит более одного раза в течение одной транзакции, а между чтениями отдельная транзакция вносит изменения в эту строку. При повторном чтении в первой транзакции будут считываться другие данные, поэтому в пределах одной транзакции получаются неповторяемые результаты.
  3. Фантомное чтение (Phantom read). Чтение, возникающее в том случае, когда одна транзакция пытается прочитать строку, которая еще не существует в начале данной транзакции, но вставляется второй транзакцией, прежде чем закончится первая транзакция. Если первая транзакция снова выполнит поиск этой строки, то обнаружит ее неожиданное появление. Эта новая строка называется фантомной строкой.[16]

     В таблице 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)

     Для замещения принятого по умолчанию  уровня изолированности можно использовать подсказки блокировки на уровне таблиц. [13 - 16]

2.2 Режимы транзакций в SQL Server

 

     Транзакция  может начинаться в одном из трех режимов: автофиксация (autocommit), явный  режим (explicit) или неявный режим (implicit). По умолчанию для SQL Server принят режим  автофиксации.

  1. Режим автофиксации. В режиме автофиксации каждый оператор T-SQL фиксируется по его завершении, и в этом режиме не требуется никаких дополнительных операторов для управления транзакциями.  Каждая транзакция состоит только из одного оператора T-SQL. Режим автофиксации полезен при выполнении операторов с помощью интерактивной командной строки, утилиты OSQL или анализатора очередей SQL Server Query Аnalyzer, поскольку не нужно задавать в явном виде запуск и окончание каждой транзакции. Каждый оператор будет рассматриваться системой SQL Server как отдельная транзакция и будет фиксироваться сразу после его завершения. Режим автофиксации будет использоваться в каждом соединении с SQL Server, пока не запустить транзакцию в явном режиме с помощью оператора BEGIN TRANSACTION или пока не укажете неявный режим. По окончании явно заданной транзакции или после отключения неявного режима SQL Server возвращается к режиму автофиксации.
  1. Явный режим - используется чаще всего для программных приложений, а также для хранимых процедур, триггеров и сценариев. При запуске группы операторов для выполнения какой-либо задачи может потребоваться указание начала и конца данной транзакции, чтобы затем выполнить фиксацию всей группы операторов или отмену (откат) модификаций всей группы. Если явно указывается начало и конец транзакции, и такую транзакцию называют явной транзакцией. Явная транзакция задается с помощью.

     Использование явной  транзакции. Ситуация, в которой потребовалось бы использование явной транзакции для запуска и окончания задачи. Имеется хранимая процедура с именем Place_Order (Поместить_Заказ), которая управляет в базе данных задачей размещения заказа покупателя на какой-либо товар. Эта процедура включает в себя следующие шаги: выбор информации о текущем счете покупателя, ввод идентификационного номера нового заказа и наименования товара, расчет стоимости заказа с учетом налогов, обновление остатка на счете покупателя с учетом общей стоимости и проверка наличия товара на складе.

     Для согласованности информации в базе данных нужно, чтобы были завершены все эти шаги или не был завершен ни один из этих шагов. Для этой цели сгруппируем все операторы, управляющие данной задачей, в одну явную транзакцию. Если эти операторы не будут объединены в одну группу, это может привести к несогласованному состоянию данных.

     Использование явных транзакций, когда задача состоит  из нескольких шагов, также дает преимущества, поскольку SQL Server (независимо от использования  операторов ROLLBACK) автоматически выполнит откат транзакций в случае серьезных  ошибок, таких как обрыв связи в сети, аварийный сбой (базы данных или клиентской системы) или взаимоблокировка. Для запуска транзакции используется оператор T-SQL BEGIN TRANSACTION. Чтобы указать конец транзакции, используется COMMIT TRANSACTION или ROLLBACK TRANSACTION. В операторе BEGIN TRANSACTION можно дополнительно указать имя транзакции и затем ссылаться на эту транзакцию по имени в операторе COMMIT TRANSACTION или ROLLBACK TRANSACTION.

     3. Неявный режим. В неявном режиме транзакция автоматически начинается при использовании определенных операторов T-SQL и продолжается, пока не появится оператор явного окончания COMMIT или ROLLBACK. Если оператор окончания не указан, то при отсоединении пользователя происходит откат данной транзакции. Следующие операторы T-SQL являются началом новой транзакции в неявном режиме: ALTER TABLE, CREATE, DELETE, DROP, FETCH, GRANT, INSERT, OPEN, REVOKE, SELECT, TRUNCATE TABLE, UPDATE.

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

    1. Фиксирование транзакций
 

     Фиксированной называется транзакция, все модификации  которой стали постоянной частью базы данных. До фиксирования транзакции запись о ее модификациях и запись ее фиксирования заносятся в журнал транзакций базы данных. Таким образом, модификации, которые становятся постоянной частью базы данных, могут находиться в одном из двух мест: либо они фактически записываются на диск и, тем самым, оказываются в базе данных, либо они находятся в кэше данных, что позволяет в случае сбоя выполнить повтор транзакции с помощью журнала транзакций, чтобы избежать потери данной транзакции.

     Все ресурсы, используемые транзакцией, такие как блокировки, освобождаются после фиксирования данной транзакции. Фиксирование транзакции считается успешным в случае успешного завершения каждого из ее операторов. Ниже приводится небольшая транзакция с именем 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]

Схема журнала транзакций.doc

— 63.00 Кб (Просмотреть файл, Скачать файл)

Информация о работе Понятие транзакции