Udostępnij za pośrednictwem


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