事務隔離級別

2021-05-02 01:44:50 字數 1783 閱讀 1951

四種隔離級別

隔離級別

髒 讀不可重複讀取

幻 像讀操作未提交(read uncommitted)是是

是讀操作已提交(read committed)否是

是可重複讀(repeatable read)否否

是快照否否

否可序列讀(serializable)否否

否 sql server 還支援使用行版本控制的兩個事務隔離級別:已提交讀隔離 和 新事務隔離級別(快照)。

隔離級別是根據稱為現象(phenomena)的三個禁止操作序列來宣告的:

名稱描述

丟失更新

當兩個或多個事務選擇同一行,然後基於最初選定的值更新該行時,就會發生這種情況。

髒讀

(dirty read)

如果乙個事務在提交操作結果之前,另乙個事務可以看到該結果,就會發生這種情況。

不可重複讀/模糊讀

(non-repeatable read)

如果乙個事務在提交結果之前,另乙個事務可以修改和刪除它,就會發生這種情況。

幻像讀

(phantom read)

當對某行執行插入或刪除操作,而該行屬於某個事務正在讀取的行的範圍時,就會發生這種情況。

有刪除,有新增。

鎖分類關鍵字

粒度

rowlock, paglock, tablock, dblock 模式

updlock, xlock 併發

nolock, holdlock, readcommitted, repeatableread, serializables

transaction中isolationlevel的型別定義如下:

chaos 無法改寫隔離級別更高的事務中的掛起的更改。

readcommitted 在正在讀取資料時保持共享鎖,以避免髒讀,但是在事務結束之前可以更改資料,從而導致不可重複的讀取或幻像資料。

readuncommitted 可以進行髒讀,意思是說,不發布共享鎖,也不接受獨佔鎖。  

repeatableread 在查詢中使用的所有資料上放置鎖,以防止其他使用者更新這些資料。防止不可重複的讀取,但是仍可以有幻像行。  

使用該隔離級別將限制其他使用者更新自己所持有的資料,以pk,ix(unique)為依據的不限制插入。

serializable 在dataset上放置範圍鎖,以防止在事務完成之前由其他使用者更新行或向資料集中插入行。

使用該隔離級別將限制其他使用者更新自己所持有的資料,限制其他使用者插入資料。 

unspecified  正在使用與指定隔離級別不同的隔離級別,但是無法確定該級別。

附測試c#**:

sql query:

-- begin transaction

insert into task (taskid,senderaliasid,taskstatus)

values('2009081215121000',3,3)

-- waitfor delay '00:00:00.200'

delete from task where taskid='2009081215121000'

-- commit

事務隔離級別

1 serializable 最嚴格的spring事務隔離級別,事務序列執行,資源消耗最大 3 read committed 大多數主流資料庫的預設spring事務隔離等級,保證了乙個事務不會讀到另乙個並行事務已修改但未提交的資料,避免了 髒讀取 該級別適用於大多數系統。4 read uncommi...

事務隔離級別

需要防止的現象和事務隔離級別 ansi iso sql 標準 sql92 定義了四種事務隔離級別 transaction isolation level 這四種隔離級別所能提供的事務處理能力各不相同。這些事務隔離級別是針對三種現象定義的,在併發事務執行時,需要阻止這三種現象 中的一種或多種發生。三種...

事務隔離級別

1.read uncommitted 讀未提交。可以讀取未提交的資料。比如 我有乙個賬戶裡面有1000元,對方給我打了1000還未提交,我這時檢視會有2000,我以為收到了,放心睡覺去了,可是對方他這1000給回滾了。實際我賬戶還是1000 這是髒讀 2.read committed 讀提交。讀到資...