四種隔離級別:
隔離級別
髒 讀不可重複讀取
幻 像讀操作未提交(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 讀提交。讀到資...