Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
5 УправлениеТранзакциями.docx
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
80.9 Кб
Скачать

Применяем уровень изоляции serializable

  1. Запустите SQL Server Management Studio и откройте окно NewQuery (Новый запрос).

  2. Допустим, нужно просмотреть тот же столбец Количество, что и раньше. Теперь мы используем уровень изоляции SERIALIZABLE.чтобы предотвратить не только изменения данных, но и фантомные чтения. Введите и выполните следующую инструкцию.

USE Ваша_База_Данных;

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

BEGIN TRAN

SELECT Sum(Количество)

FROM Поставки WHERE Код_Проекта = ‘J4’ AND AND Код_Поставщика=‘S3’

3. Откройте еще одно окно запроса и попробуйте выполнить вставку новой строки для заказа, обрабатываемого в окне запроса Query Window1.

INSERT INTO Поставки

(Код_Поставщика, Код_Детали, Код_Проекта) VALUES(‘S3’,’P1’,’J4’, 888)

  1. Закройте окно запроса Query Window 2, потому что видно, что этот запрос заблокирован. Мы убедились в том, что уровень изоляции SERIALIZABLE предотвращает также вставку (INSERT) новых строк в диапазон данных, который считывается транзакцией.

  2. Выполните инструкцию COMMIT TRAN, а затем закройте все окна запросов.

Борьба с блокированиями

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

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

  • Сохраняйте минимально возможную продолжительность транзакций.

  • Никогда не требуйте пользовательского ввода в процессе выполнения транзакции.

  • Подумайте об использовании управления версиями строк при чтении данных.

  • В процессе транзакции обращайтесь к минимально возможному объему данных.

■ Используйте самые низкие из возможных уровней изоляции транзакции.

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

Выполняем мониторинг блокирований при помощи динамических административных представлений

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

  1. Запустите SQL Server Management Studio и откройте окно New Query(Новый запрос).

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

USE Ваша_База_Данных;

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ

BEGIN TRAN

SELECT Sum(Количество)

FROM Поставки WHERE Код_Проекта = ‘J4’ AND Код_Поставщика=‘S3’

3. Откройте еще одно окно запроса и выполните следующую инструкцию UPDATE. Она будет блокирована транзакцией в окне запросаQuery Window 1.

USE Ваша_База_Данных;

UPDATE Поставки SET Количество = 333 WHERE Код_Проекта = ‘J4’ AND Код_Поставщика=‘S3’

He завершайте выполнение инструкции UPDATE и откройте еще одно окно запроса.

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

SELECT * FROM sys.dm_os_waiting_tasks

WHERE session_id > 49 AND wait_duration_ms > 5000

При помощи этой инструкции вы получаете информацию обо всех процессах пользователей с идентификаторами сеанса больше 49, которые были блокированы больше чем на 5 секунд по любой причине. Столбец blocking_session_id содержит идентификаторы сеанса для заблокированных сеансов. Запишите идентификатор сеанса в результате, чтобы воспользоваться им в пункте 7.

6. Чтобы получить информацию о том, какую инструкцию пытается выполнить заблокированный процесс, можно использовать следующую инструкцию. Эта инструкция соединяет представление sys.dm_os_waiting_tasks с представлением sys.dm_exec_requests, которое возвращает информацию о выполняющихся запросах. Кроме того, эта инструкция использует функцию sys.dm_exec_sql_text(), которая может извлечь инструкцию SQL через дескриптор, предоставляемый в представлении sys.dm_exec_requests.Выполните следующий код:

SELECT (select SUBSTRING(text,statement_start_offset/2,

(case when statement_end_offset = -1 then

len(convert(nvarchar(max), text)) * 2 else

statement_end_offset end -statement_start_offset)/2)

from sys.dm_exec_sql_text(sql_handle)) as query text

FROM

sys.dm_os_waitjng_tasks wt JOIN

sys.dm_exec_requests r

ON r.session_id = wt.session_id

WHERE r.session_id > 50

AND wait_duration_ms > 5000

7. Дополнительную информацию о соединении, участвующем в сценарии блокирования, можно извлечь при помощи представленияsys.dm__exec_connections. Замените идентификатор сеанса в запросе(51 в коде, представленном ниже) реальным идентификатором сеанса заблокированного или блокируемого сеанса.

SELECT *

FROM sys.dm_exec_connections

WHERE session_id = 51 -Replace with your id

8. Выполните инструкцию COMMIT TRAN в окне запроса QueryWindow 1, после чего закройте все окна запросов.