日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

数据库事务的隔离级别

發布時間:2025/3/21 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库事务的隔离级别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

.NET?提供的數據庫事務隔離級別 System.Data.IsolationLevel 枚舉用于指定連接的事務鎖定行為,它包含如下枚舉:

Chaos 無法改寫隔離級別更高的事務中的掛起的更改。?
ReadCommitted 在正在讀取數據時保持共享鎖,以避免臟讀,但是在事務結束之前可以更改數據,從而導致不可重復的讀取或幻像數據。?
ReadUncommitted 可以進行臟讀,意思是說,不發布共享鎖,也不接受獨占鎖。?
RepeatableRead 在查詢中使用的所有數據上放置鎖,以防止其他用戶更新這些數據。防止不可重復的讀取,但是仍可以有幻像行。?
Serializable 在?DataSet?上放置范圍鎖,以防止在事務完成之前由其他用戶更新行或向數據集中插入行。?
Snapshot 通過在一個應用程序正在修改數據時存儲另一個應用程序可以讀取的相同數據版本來減少阻止。表示您無法從一個事務中看到在其他事務中進行的更改,即便重新查詢也是如此。?
Unspecified 正在使用與指定隔離級別不同的隔離級別,但是無法確定該級別。?

當使用?OdbcTransaction?時,如果不設置?IsolationLevel?或者將?IsolationLevel?設置為?Unspecied,事務將根據基礎 ODBC 驅動程序的默認隔離級別來執行。

?

說心里話,平時就是照著例子代碼抄,也沒理會這些值。不過要想真的理解并能靈活運用,看MSDN的解釋估計感到困惑的不只我一個。從今天起,我決定要把這些值的真正含義搞清楚。首先,還是要去研究一下SQL Server的鎖機制:

SQL SERVER鎖的機制

???SQL server的所有活動都會產生鎖。鎖定的單元越小,就越能越能提高并發處理能力,但是管理鎖的開銷越大。如何找到平衡點,使并發性和性能都可接受是SQL Server的難點。
SQL Server有如下幾種瑣:

1、 共享鎖
用于只讀操作(SELECT),鎖定共享的資源。共享鎖不會阻止其他用戶讀,但是阻止其他的用戶寫和修改。

2、 更新鎖
更新鎖是一種意圖鎖,當一個事務已經請求共享瑣后并試圖請求一個獨占鎖的時候發生更新瑣。例如當兩個事務在幾行數據行上都使用了共享鎖,并同時試圖獲取獨占鎖以執行更新操作時,就發生了死鎖:都在等待對方釋放共享鎖而實現獨占鎖。更新鎖的目的是只讓一個事務獲得更新鎖,防止這種情況的發生。

3、 獨占鎖
一次只能有一個獨占鎖用在一個資源上,并且阻止其他所有的鎖包括共享縮。寫是獨占鎖,可以有效的防止’臟讀’。

4、 意圖縮
在使用共享鎖和獨占鎖之前,使用意圖鎖。從表的層次上查看意圖鎖,以判斷事務能否獲得共享鎖和獨占鎖,提高了系統的性能,不需從頁或者行上檢查。

5、 計劃鎖
Sch-M,Sch-S。對數據庫結構改變時用Sch-M,對查詢進行編譯時用Sch-S。這兩種鎖不會阻塞任何事務鎖,包括獨占鎖。

讀是共享鎖,寫是排他鎖,先讀后更新的操作是更新鎖,更新鎖成功并且改變了數據時更新鎖升級到排他鎖。鎖的類型有:
DB-----數據庫,由于 dbid 列已包含數據庫的數據庫 ID,所以沒有提供任何信息
FIL----文件
IDX----索引
PG-----頁,數據或索引頁。頁碼。頁由 fileid:page 組合進行標識,其中,fileid 是 sysfiles 表中的 fileid,而 page 是該文件內的邏輯頁碼。
KEY----鍵,用于保護可串行事務中的鍵范圍
TAB----表,包括所有數據和索引在內的整個表。由于 ObjId 列已包含表的對象 ID,所以沒有提供任何信息
EXT----區域, 相鄰的八個數據頁或索引頁構成的一組。正被鎖定的擴展盤區中的第一個頁碼。頁由 fileid:page 組合進行標識
RID----行,表內已鎖定行的行標識符。行由 fileid:page:rid 組合進行標識,其中,rid 是頁中的行標識符。

細分鎖的模式:
0 Null 沒有得到資源的訪問權限
1 Sch-S (Schema stability) 對查詢進行編譯時。能防止加鎖的對象被刪除直到解鎖
2 Sch-M (Schema Modification) 改變數據庫結構時發生。能防止其他的事務訪問加鎖的對象
3 IS (Intent Shares) 意圖共享鎖。
4 SIU(Share Intent Update) 意圖在維護資源的共享鎖時,把更新鎖放到鎖層次結構的下層資源上
5 IS-S(Intent Share-shared) 復合鍵范圍鎖
6 IX(Intent Exclusive) 意圖排他鎖
7 SIX(Share Intent Exclusive)?
8 S(Share) 共享鎖
9 U(Update) 更新鎖。防止死鎖
10 Iin-Nul(Intent Insert-Null) 索引行層次的鎖定,復合鍵范圍鎖
11 IS-X(Intent Share-Exclusive)?
12 IU(Intent Update) 意圖更新鎖
13 IS-U(Intent Share Update) 串行更新掃描
14 X(Exclusive) 排他鎖
15 BU 塊操作使用的鎖

所以有如下的結論。

1、一個連接在修改數據塊時別的連接不能修改這個數據塊,直到解鎖。
并行訪問是任何數據庫解決方案都最為重視的問題了,為了解決并行訪問方面的問題各類數據庫系統提出了各種各樣的方案。SQL Server采用了多線程機制,它當然能夠一次處理多個請求。不過,在用戶修改數據的情況下并行訪問問題就變得復雜起來了。顯然,數據庫通常只允許唯一用戶一次修改特定的數據。當某一用戶開始修改某塊數據時, SQL Server能很快地鎖定數據,阻止其他用戶對這塊數據進行更新,直到修改該數據的第一位用戶完成其操作并提交交易或者回滾。但是,當某一位用戶正在修改某塊數據時假設另一位用戶又正想查詢該數據的信息時會發生什么情況呢?
2、通常情況下,一個連接在修改數據塊時別的連接也不能查詢這個數據塊,直到解鎖。反之亦然:讀的時候不能寫和修改。這個方案會降低系統的性能和效率,盡管現在是行級鎖(7.0以前是鎖頁甚至是鎖表),如果你一次修改多行數據,SQL Server則會把數據鎖定范圍提升到頁級別乃至鎖定整個數據表,從而不必針對每一記錄跟蹤和維護各自的數據鎖,這樣能加快修改的速度,消耗小的服務器資源,但是并發性就差了。。
3、一個連接寫的時候,另一個連接可以寫,但是不得讀
4、多個連接可以同時讀同一行。

所以鎖發生在讀、寫的競爭上。

5、設置事務的級別 SET TRANSACTION ISOLATION LEVEL
A、READ COMMITTED :指定在讀取數據時控制共享鎖以避免臟讀,但數據可在事務結束前更改,從而產生不可重復讀取或幻像數據。該選項是 SQL Server 的默認值。
B、READ UNCOMMITTED:執行臟讀或 0 級隔離鎖定,這表示不發出共享鎖,也不接受排它鎖。當設置該選項時,可以對數據執行未提交讀或臟讀;在事務結束前可以更改數據內的數值,行也可以出現在數據集中或從數據集消失。這是四個隔離級別中限制最小的級別。
C、REPEATABLE READ:鎖定查詢中使用的所有數據以防止其他用戶更新數據,但是其他用戶可以將新的幻像行插入數據集,且幻像行包括在當前事務的后續讀取中。因為并發低于默認隔離級別,所以應只在必要時才使用該選項。
D、SERIALIZABLE:在數據集上放置一個范圍鎖,以防止其他用戶在事務完成之前更新數據集或將行插入數據集內。這是四個隔離級別中限制最大的級別。因為并發級別較低,所以應只在必要時才使用該選項。該選項的作用與在事務內所有 SELECT 語句中的所有表上設置 HOLDLOCK 相同。
注釋
一次只能設置這些選項中的一個,而且設置的選項將一直對那個連接保持有效,直到顯式更改該選項為止。這是默認行為,除非在語句的 FROM 子句中在表級上指定優化選項。
SET TRANSACTION ISOLATION LEVEL 的設置是在執行或運行時設置,而不是在分析時設置。

術語解釋:

在一個程序中,依據事務的隔離級別將會有三種情況發生。
  
  ◆臟讀:一個事務會讀進還沒有被另一個事務提交的數據,所以你會看到一些最后被另一個事務回滾掉的數據。

  ◆ 讀值不可復現:一個事務讀進一條記錄,另一個事務更改了這條記錄并提交完畢,這時候第一個事務再次讀這條記錄時,它已經改變了。

  ◆ 幻影讀:一個事務用Where子句來檢索一個表的數據,另一個事務插入一條新的記錄,并且符合Where條件,這樣,第一個事務用同一個where條件來檢索數據后,就會多出一條記錄。

(以上文章摘自網絡)

結合以上的理論知識,將IsolationLevel枚舉的各值解釋如下:

ReadCommitted:?
假設A事務對正在讀取數據Data放置了共享鎖,那么Data不能被其它事務改寫,所以當B事務對Data進行讀取時總和A讀取的Data數據是一致的,所以避免了臟讀。由于在A沒有提交之前可以對Data進行改寫,那么B讀取到的某個值可能會在其讀取后被A更改從而導致了該值不能被重復取得;或者當B再次用相同的where字句時得到了和前一次不一樣數據的結果集,也就是幻像數據。

ReadUncommitted:
假設A事務即不發布共享鎖,也不接受獨占鎖,那么并發的B或者其它事務可以改寫A事務讀取的數據,那么并發的C事務讀取到的數據的狀態和A的或者B的數據都可能不一致,那么。臟讀、不可重復讀、幻象數據都可能存在。

RepeatableRead:
(注意MSDN原文中的第一句話:在查詢中使用的所有數據上放置鎖,所以不存在臟讀的情況)。
假設A事務對讀取的所有數據Data放置了鎖,以阻止其它事務對Data的更改,在A沒有提交之前,新的并發事務讀取到的數據如果存在于Data中,那么該數據的狀態和A事務中的數據是一致的,從而避免了不可重復的讀取。但在A事務沒有結束之前,B事務可以插入新記錄到Data所在的表中,那么其它事務再次用相同的where字句查詢時,得到的結果數可能上一次的不一致,也就是幻像數據。

Serializable:
?在數據表上放置了排他鎖,以防止在事務完成之前由其他用戶更新行或向數據集中插入行,這是最嚴格的鎖。它防止了臟讀、不可重復讀取和幻象數據。

以下是對照表:

隔離級別 臟讀(Dirty Read) 不可重復讀(NonRepeatable Read) 幻讀(Phantom Read)
讀未提交(Read uncommitted) 可能 可能 可能
讀已提交(Read committed) 不可能 可能 可能
可重復讀(Repeatable read) 不可能 不可能 可能
可串行化(Serializable ) 不可能 不可能 不可能

READPAST?指定數據庫引擎不讀取由其他事務鎖定的行。行級鎖和頁級鎖都將被跳過. 也就是說,數據庫引擎將跳過這些行或頁,而不是阻塞當前事務直到鎖被釋放。例如,假設表 T1 包含一個單精度整數列,其值為 1、2、3、4 和 5。如果事務 A 將值 3 更改為 8,但尚未提交,則 SELECT * FROM T1 (READPAST) 將生成值 1、2、4 和 5。

READUNCOMMITTED?指定允許臟讀。不發布共享鎖來阻止其他事務修改當前事務讀取的數據,其他事務設置的排他鎖不會阻礙當前事務讀取鎖定數據。允許臟讀可能產生較多的并發操作,但其代價是讀取以后會被其他事務回滾的數據修改。這可能會使您的事務出錯,向用戶顯示從未提交過的數據,或者導致用戶兩次看到記錄(或根本看不到記錄)。

HOLDLOCK? 等同于 SERIALIZABLE 保持共享鎖直到事務完成,使共享鎖更具有限制性;而不是無論事務是否完成,都在不再需要所需表或數據頁時立即釋放共享鎖。執行掃描時所用的語義與在 SERIALIZABLE 隔離級別運行的事務的語義相同。

TABLOCK?指定對表采用共享鎖并讓其一直持有,直至語句結束。如果同時指定了 HOLDLOCK,則會一直持有共享表鎖,直至事務結束。

UPDLOCK?指定采用更新鎖并保持到事務完成。


from:?http://www.cnblogs.com/kinghuhua/archive/2011/08/17/2142902.html

總結

以上是生活随笔為你收集整理的数据库事务的隔离级别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。