控制由連接發(fā)出的所有 Microsoft? SQL Server? SELECT 語(yǔ)句的默認(rèn)事務(wù)鎖定行為。
SET TRANSACTION ISOLATION LEVEL
{ READ COMMITTED
| READ UNCOMMITTED
| REPEATABLE READ
| SERIALIZABLE
}
READ COMMITTED
指定在讀取數(shù)據(jù)時(shí)控制共享鎖以避免臟讀,但數(shù)據(jù)可在事務(wù)結(jié)束前更改,從而產(chǎn)生不可重復(fù)讀取或幻像數(shù)據(jù)。該選項(xiàng)是 SQL Server 的默認(rèn)值。
READ UNCOMMITTED
執(zhí)行臟讀或 0 級(jí)隔離鎖定,這表示不發(fā)出共享鎖,也不接受排它鎖。當(dāng)設(shè)置該選項(xiàng)時(shí),可以對(duì)數(shù)據(jù)執(zhí)行未提交讀或臟讀;在事務(wù)結(jié)束前可以更改數(shù)據(jù)內(nèi)的數(shù)值,行也可以出現(xiàn)在數(shù)據(jù)集中或從數(shù)據(jù)集消失。該選項(xiàng)的作用與在事務(wù)內(nèi)所有語(yǔ)句中的所有表上設(shè)置 NOLOCK 相同。這是四個(gè)隔離級(jí)別中限制最小的級(jí)別。
REPEATABLE READ
鎖定查詢中使用的所有數(shù)據(jù)以防止其他用戶更新數(shù)據(jù),但是其他用戶可以將新的幻像行插入數(shù)據(jù)集,且幻像行包括在當(dāng)前事務(wù)的后續(xù)讀取中。因?yàn)椴l(fā)低于默認(rèn)隔離級(jí)別,所以應(yīng)只在必要時(shí)才使用該選項(xiàng)。
SERIALIZABLE
在數(shù)據(jù)集上放置一個(gè)范圍鎖,以防止其他用戶在事務(wù)完成之前更新數(shù)據(jù)集或?qū)⑿胁迦霐?shù)據(jù)集內(nèi)。這是四個(gè)隔離級(jí)別中限制最大的級(jí)別。因?yàn)椴l(fā)級(jí)別較低,所以應(yīng)只在必要時(shí)才使用該選項(xiàng)。該選項(xiàng)的作用與在事務(wù)內(nèi)所有 SELECT 語(yǔ)句中的所有表上設(shè)置 HOLDLOCK 相同。
一次只能設(shè)置這些選項(xiàng)中的一個(gè),而且設(shè)置的選項(xiàng)將一直對(duì)那個(gè)連接保持有效,直到顯式更改該選項(xiàng)為止。這是默認(rèn)行為,除非在語(yǔ)句的 FROM 子句中在表級(jí)上指定優(yōu)化選項(xiàng)。
SET TRANSACTION ISOLATION LEVEL 的設(shè)置是在執(zhí)行或運(yùn)行時(shí)設(shè)置,而不是在分析時(shí)設(shè)置。
下例為會(huì)話設(shè)置 TRANSACTION ISOLATION LEVEL。對(duì)于每個(gè)后續(xù) Transact-SQL 語(yǔ)句,SQL Server 將所有共享鎖一直控制到事務(wù)結(jié)束為止。
SET TRANSACTION ISOLATION LEVEL REPEATABLE READGOBEGIN TRANSACTIONSELECT * FROM publishersSELECT * FROM authors...COMMIT TRANSACTION
臟讀
臟讀包含未提交數(shù)據(jù)的讀。例如,事務(wù)1 更改了某行。事務(wù)2 在事務(wù)1 提交更改之前讀取已更改的行。如果事務(wù)1 回滾更改,則事務(wù)2 便讀取了邏輯上從未存在過(guò)的行。
臟讀就是指當(dāng)一個(gè)事務(wù)正在訪問數(shù)據(jù),并且對(duì)數(shù)據(jù)進(jìn)行了修改,而這種修改還沒有提交到數(shù)據(jù)庫(kù)中,這時(shí),另外一個(gè)事務(wù)也訪問這個(gè)數(shù)據(jù),然后使用了這個(gè)數(shù)據(jù)。因?yàn)檫@個(gè)數(shù)據(jù)是還沒有提交的數(shù)據(jù),那么另外一個(gè)事務(wù)讀到的這個(gè)數(shù)據(jù)是臟數(shù)據(jù),依據(jù)臟數(shù)據(jù)所做的操作可能是不正確的。
不可重復(fù)讀
不可重復(fù)讀取當(dāng)某個(gè)事務(wù)不止一次讀取同一行,并且一個(gè)單獨(dú)的事務(wù)在兩次(或多次)讀取之間修改該行時(shí)。因?yàn)樵谕粋€(gè)事務(wù)內(nèi)的多次讀取之間修改了該行,所以每次讀取都生成不同值,從而引發(fā)不一致問題。
不可重復(fù)讀是指在一個(gè)事務(wù)內(nèi),多次讀同一數(shù)據(jù)。在這個(gè)事務(wù)還沒有結(jié)束時(shí),另外一個(gè)事務(wù)也訪問該同一數(shù)據(jù)。那么,在第一個(gè)事務(wù)中的兩次讀數(shù)據(jù)之間,由于第二個(gè)事務(wù)的修改,那么第一個(gè)事務(wù)兩次讀到的數(shù)據(jù)可能是不一樣的。這樣就發(fā)生了在一個(gè)事務(wù)內(nèi)兩次讀到的數(shù)據(jù)是不一樣的,因此稱為是不可重復(fù)讀。
幻像
幻像通過(guò)一個(gè)任務(wù),在以前由另一個(gè)尚未提交其事務(wù)的任務(wù)讀取的行的范圍中插入新行或刪除現(xiàn)有行。帶有未提交事務(wù)的任務(wù)由于該范圍中行數(shù)的更改而無(wú)法重復(fù)其原始讀取。如果某個(gè)連接設(shè)置其事務(wù)隔離級(jí)別為可串行,則 SQL Server 使用鍵范圍鎖定以防止幻像。
幻覺讀是指當(dāng)事務(wù)不是獨(dú)立執(zhí)行時(shí)發(fā)生的一種現(xiàn)象,例如第一個(gè)事務(wù)對(duì)一個(gè)表中的數(shù)據(jù)進(jìn)行了修改,這種修改涉及到表中的全部數(shù)據(jù)行。同時(shí),第二個(gè)事務(wù)也修改這個(gè)表中的數(shù)據(jù),這種修改是向表中插入一行新數(shù)據(jù)。那么,以后就會(huì)發(fā)生操作第一個(gè)事務(wù)的用戶發(fā)現(xiàn)表中還有沒有修改的數(shù)據(jù)行,就好象發(fā)生了幻覺一樣。
聯(lián)系客服