Przykład poziomu izolacji oparte na wersji wiersza
Następujące przykłady przedstawiają różnice sposobów działania migawka izolacji transakcji i popełnione odczytu używających wersji wiersza.
Ostrzeżenie
Jest zrozumieć poziomów izolacji oparte na wersji wiersza przed recenzowania w poniższych przykładach.See Opis wiersza na podstawie wersji poziomów izolacji and Wiersz wersji na podstawie poziomów izolacji.
Przykłady
A.Praca z izolacji migawka
W tym przykładzie migawka izolacji transakcji odczytuje dane, która następnie zostanie zmodyfikowany przez inną transakcję.Nie obsługuje transakcji migawka blok operacji aktualizacji wykonane przez innych transakcji i jest kontynuowany do odczytywania danych z określonej wersji wiersza, ignorując modyfikacji danych.Jednakże gdy transakcji migawka próbuje modyfikować dane, które już zostały zmodyfikowane przez inne transakcje, transakcji migawka generuje błąd i jest zakończony.
Na sesja 1:
USE AdventureWorks2008R2;
GO
-- Enable snapshot isolation on the database.
ALTER DATABASE AdventureWorks2008R2
SET ALLOW_SNAPSHOT_ISOLATION ON;
GO
-- Start a snapshot transaction
SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
GO
BEGIN TRANSACTION;
-- This SELECT statement will return
-- 48 vacation hours for the employee.
SELECT BusinessEntityID, VacationHours
FROM HumanResources.Employee
WHERE BusinessEntityID = 4;
Na sesja 2:
USE AdventureWorks2008R2;
GO
-- Start a transaction.
BEGIN TRANSACTION;
-- Subtract a vacation day from employee 4.
-- Update is not blocked by session 1 since
-- under snapshot isolation shared locks are
-- not requested.
UPDATE HumanResources.Employee
SET VacationHours = VacationHours - 8
WHERE BusinessEntityID = 4;
-- Verify that the employee now has 40 vacation hours.
SELECT VacationHours
FROM HumanResources.Employee
WHERE BusinessEntityID = 4;
Na sesja 1:
-- Reissue the SELECT statement - this shows
-- the employee having 48 vacation hours. The
-- snapshot transaction is still reading data from
-- the versioned row.
SELECT BusinessEntityID, VacationHours
FROM HumanResources.Employee
WHERE BusinessEntityID = 4;
Na sesja 2:
-- Commit the transaction; this commits the data
-- modification.
COMMIT TRANSACTION;
GO
Na sesja 1:
-- Reissue the SELECT statement - this still
-- shows the employee having 48 vacation hours
-- even after the other transaction has committed
-- the data modification.
SELECT BusinessEntityID, VacationHours
FROM HumanResources.Employee
WHERE BusinessEntityID = 4;
-- Because the data has been modified outside of the
-- snapshot transaction, any further data changes to
-- that data by the snapshot transaction will cause
-- the snapshot transaction to fail. This statement
-- will generate a 3960 error and the transaction will
-- terminate.
UPDATE HumanResources.Employee
SET SickLeaveHours = SickLeaveHours - 8
WHERE BusinessEntityID = 4;
-- Undo the changes to the database from session 1.
-- This will not undo the change from session 2.
ROLLBACK TRANSACTION
GO
B.Praca z popełnionych odczytu przy użyciu wersji wiersza
W tym przykładzie transakcji popełnione odczytu za pomocą wersji wiersza uruchamia się równocześnie z innej transakcji.Transakcja przekazana odczytu zachowuje się inaczej niż transakcji migawka.Jak transakcji migawka transakcja przekazana odczytu odczyta numerów wersji wierszy nawet po innych transakcji zmodyfikował dane.Jednak w przeciwieństwie do transakcji migawka transakcja przekazana odczytu będzie:
Przeczytaj zmodyfikowane dane po innych transakcji zatwierdza zmiany danych.
Można aktualizować dane zmodyfikowane przez inne transakcje gdzie transakcji migawka nie.
Na sesja 1:
USE AdventureWorks2008R2;
GO
-- Enable READ_COMMITTED_SNAPSHOT on the database.
-- For this statement to succeed, this session
-- must be the only connection to the AdventureWorks2008R2
-- database.
ALTER DATABASE AdventureWorks2008R2
SET READ_COMMITTED_SNAPSHOT ON;
GO
-- Start a read-committed transaction
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
GO
BEGIN TRANSACTION;
-- This SELECT statement will return
-- 48 vacation hours for the employee.
SELECT BusinessEntityID, VacationHours
FROM HumanResources.Employee
WHERE BusinessEntityID = 4;
Na sesja 2:
USE AdventureWorks2008R2;
GO
-- Start a transaction.
BEGIN TRANSACTION;
-- Subtract a vacation day from employee 4.
-- Update is not blocked by session 1 since
-- under read-committed using row versioning shared locks are
-- not requested.
UPDATE HumanResources.Employee
SET VacationHours = VacationHours - 8
WHERE BusinessEntityID = 4;
-- Verify that the employee now has 40 vacation hours.
SELECT VacationHours
FROM HumanResources.Employee
WHERE BusinessEntityID = 4;
Na sesja 1:
-- Reissue the SELECT statement - this still shows
-- the employee having 48 vacation hours. The
-- read-committed transaction is still reading data
-- from the versioned row and the other transaction
-- has not committed the data changes yet.
SELECT BusinessEntityID, VacationHours
FROM HumanResources.Employee
WHERE BusinessEntityID = 4;
Na sesja 2:
-- Commit the transaction.
COMMIT TRANSACTION;
GO
Na sesja 1:
-- Reissue the SELECT statement which now shows the
-- employee having 40 vacation hours. Being
-- read-committed, this transaction is reading the
-- committed data. This is different from snapshot
-- isolation which reads from the versioned row.
SELECT BusinessEntityID, VacationHours
FROM HumanResources.Employee
WHERE BusinessEntityID = 4;
-- This statement, which caused the snapshot transaction
-- to fail, will succeed with read-committed using row versioning.
UPDATE HumanResources.Employee
SET SickLeaveHours = SickLeaveHours - 8
WHERE BusinessEntityID = 4;
-- Undo the changes to the database from session 1.
-- This will not undo the change from session 2.
ROLLBACK TRANSACTION;
GO