事務的隔離級別(Transaction isolation levels)

這張表定義了五個隔離級別。 sql

在sql server2005和以後的版本里,默認的隔離級別有兩個不一樣的執行方式。爲了瞭解這每一種級別, 咱們能夠看一些例子。先建一個數據庫和一張表吧。 數據庫


-- Create a database and table for testing the isolation levels
USE master
GO
IF EXISTS ( SELECT1
FROM  sys.databases
WHERE name = 'IsolationDB' )
DROP DATABASE IsolationDB ;
GO
CREATE DATABASE IsolationDB ;
GO
USE IsolationDB ;
GO
CREATE TABLE IsolationTest
(
col1 INT PRIMARY KEY ,
col2 VARCHAR(20)
) ;
GO
INSERT INTO IsolationTest
VALUES (10, 'The first row' ) ;
INSERT INTO IsolationTest
VALUES (20, 'The second row' ) ;
INSERT INTO IsolationTest
VALUES (30, 'The third row' ) ;
INSERT INTO IsolationTest
VALUES (40, 'The fourth row' ) ;
INSERT INTO IsolationTest
VALUES (50, 'The fifth row' ) ;
GO
先是第一種隔離級別READ UNCOMMITTED


READ UNCOMMITTED容許一個事務讀取當前的任何數據,至因而否有提交了寫數據的其它事務,它都忽略。例如,雖然另外一個使用者可能有一個事務正在執行數據修改,事務正在獨佔這個數據,可是一個定義成READ UNCOMMITTED級別的事務能不管如何都能讀取數據,而且能進一步對這些讀取的數據進行操做。 spa

有隱患,若是那些用戶執行了修改的事務以後又要回滾事務,那樣修改的又回到老樣子。若是咱們基於這個歷來都不存在的數據來進行一些數據分析,將會使決定和行動失去意義。 code

看一個例子 server


-- Step 1:
-- Start a transaction but don't commit it
USE IsolationDB ;
GO
BEGIN TRAN
UPDATE IsolationTest
SET col2 = 'New Value' ;
--<EXECUTE>
在一個查詢裏,開始了一個事務但沒有提交結束。



-- Step 2: 
-- Start a new connection and change your isolation level 
USE IsolationDB ;
GO
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT *
FROM IsolationTest ;
--<EXECUTE>
在另外一個查詢裏執行設置隔離級別,執行讀取操做。



-- Step 3: 
-- Return to the connection from Step 1 and issue a ROLLBACK
ROLLBACK TRANSACTION ;
--<EXECUTE>
回到第一個查詢,執行回滾。



-- Step 4: 
-- Rerun the SELECT statement in the connection from Step 2
SELECT *
FROM IsolationTest ;
-- <EXECUT
再次執行讀取。


在執行第二步時返回的結果是全部的col2 值都是‘new value’,即便事務在第一個查詢窗口尚未提交完成。事實上,這個事務可能歷來都沒有提交。若是咱們基於這個全部數據都同樣,而採起一些分析,咱們會懊悔的,由於這些數據有可能還會改變,不是恆久不變的。 事務

第三步,咱們回滾數據,第四步,執行讀取,看到col2數據又會到了原來的樣子。 數據分析

reading dirty的隱患遠非產生一個問題那麼簡單。若是一條語句在這個READ UNCOMMITTED隔離級別下讀取一個表格,或者讀取必定範圍的數據,會有問題,事務能夠更新一行數據,一行移到新的位置。若是讀取開始的時間在更新前,那麼讀取的是原來的行,而實際上行已經移到新位置,這樣致使語句又要讀一遍了,有可能會讀好多遍。 it

另一種狀況就是,一行數據尚未讀,就可能被更新了,移到新的表格。這樣將不能讀取完整的行了,會丟失數據。 io

相關文章
相關標籤/搜索