Atitit.資料庫交易隔離等級 attilax 總結,atititattilax

來源:互聯網
上載者:User

Atitit.資料庫交易隔離等級 attilax 總結,atititattilax

Atitit.資料庫交易隔離等級

 

1. 交易隔離等級的作用 1

2. 在的隔離等級 2

3. 常見資料庫的預設管理層級 3

 

1. 交易隔離等級的作用

 

 

較低的隔離等級可以增強許多使用者同時訪問資料的能力,但也增加了使用者可能遇到的並發副作用(例如髒讀或丟失更新)的數量。相反,較高的隔離等級減少了使用者 可能遇到的並發副作用的類型,但需要更多的系統資源,並增加了一個事務阻塞其他事務的可能性。應平衡應用程式的資料完整性要求與每個隔離等級的開銷,在此 基礎上選擇相應的隔離等級。最高隔離等級(可序列化)保證事務在每次重複讀取操作時都能準確檢索到相同的資料,但需要通過執行某種層級的鎖定來完成此操 作,而鎖定可能會影響多使用者系統中的其他使用者。最低隔離等級(未提交讀)可以檢索其他事務已經修改、但未提交的資料。在未提交讀中,所有並發副作用都可能 發生,但因為沒有讀取鎖定或版本控制,所以開銷最少

 

作者:: 老哇的爪子 Attilax 艾龍,  EMAIL:1466519819@qq.com

轉載請註明來源: http://blog.csdn.net/attilax

 

 

 

當多個事務同時進行時,通過設定隔離等級來處理髒讀、不可重複讀取、幻讀事件

read uncommitted | 0 未提交讀

將查詢的隔離等級指定為 0。

可以讀髒資料

讀髒資料:一事務對資料進行了增刪改,但未提交,有可能復原,另一事務卻讀取了未提交的資料

read committed | 1 已提交讀

將查詢的隔離等級指定為 1。

避免髒讀,但可以出現不可重複讀取和幻讀

不可重複讀取:一事務對資料進行了更新或刪除操作,另一事務兩次查詢的資料不一致

幻像讀:一事務對資料進行了新增操作,另一事務兩次查詢的資料不一致

repeatable read | 2 可重複讀

將查詢的交易隔離等級指定為 2。

避免髒讀,不可重複讀取,允許幻像讀

serializable | 3 可序列化

將查詢的隔離等級指定為 3。

序列化讀,事務只能一個一個執行,避免了髒讀、不可重複讀取、幻讀

執行效率慢(我遇到過一種情況,用時是隔離等級1的30倍),使用時謹慎

SNAPSHOT  

當讀取資料時,可以保證讀操作讀取的行是事務開始時可用的最後提交版本。

這意味著這種隔離等級可以保證讀取的是已經提交過的資料,並且可以實現可重複讀,

也能確保不會幻讀。不過這種隔離等級使用的不是共用鎖定,而是資料列版本設定。

SQL Server 2005以後的版本支援。

下表顯示了不同隔離等級允許的並發副作用。

隔離等級

髒讀

不可重複讀取

虛擬讀取

未提交讀

已提交讀

可重複讀

快照

可序列化

 

 

2. 在的隔離等級

EAD UNCOMMITTED 指定語句可以讀取已由其他事務修改但尚未提交的行。 在 READ UNCOMMITTED 層級啟動並執行事務,不會發出共用鎖定來防止其他事務修改當前事務讀取的資料。READ UNCOMMITTED 事務也不會被獨佔鎖定阻塞,獨佔鎖定會禁止當前事務讀取其他事務已修改但尚未提交的行。設定此選項之後,可以讀取未提交的修改,這種讀取稱為髒讀。在事務結束 之前,可以更改資料中的值,行也可以出現在資料集中或從資料集中消失。該選項的作用與在事務內所有 SELECT 語句中的所有表上設定 NOLOCK 相同。這是隔離等級中限制最少的層級。

READ COMMITTED 指定語句不能讀取已由其他事務修改但尚未提交的資料。這樣可以避免髒讀。其他事務可以在當前事務的各個語句之間更改資料,從而產生不可重複讀取和幻像資料。該選項是 SQL Server 的預設設定。

REPEATABLE READ 指定語句不能讀取已由其他事務修改但尚未提交的行,並且指定,其他任何事務都不能在當前事務完成之前修改由當前事務讀取的資料。 對事務中的每個語句所讀取的全部資料都設定了共用鎖定,並且該共用鎖定一直保持到事務完成為止。這樣可以防止其他事務修改當前事務讀取的任何行。其他事務可以 插入與當前事務所發出語句的搜尋條件相匹配的新行。如果當前事務隨後重試執行該語句,它會檢索新行,從而產生幻讀。由於共用鎖定一直保持到事務結束,而不是 在每個語句結束時釋放,所以並發層級低於預設的 READ COMMITTED 隔離等級。此選項只在必要時使用。

3. 常見資料庫的預設管理層級

Mssql的預設層級 預設的READ COMMITTED隔離等級來訪問資料

 

 

首先要明確Oracle裡支援的隔離等級:read committed/serializable,預設的是read committed,而MySQl支援的隔離等級:read uncommitted/read committed/repeatable read/serializable,預設的是repeatable read;

先說結論:Oracle的read committed的鎖力度和隔離等級相當於MySQL的read committed,因此Oracle裡預設的一致讀對

 

Oralce_MySQL預設隔離等級對比 - Oracle - 次元立方網 - 電腦知識與技術互動交流平台.htm

隔離等級_百度百科.htm

 

這個涉及到資料庫的隔離等級。預設情況下,oracle,mssql,mysql都是READ COMMITTED隔離等級來訪問資料

你這個原理是這樣::

事務A,開啟 ,然後讀取了資料,此時還沒有提交A事務
事務B緊接的更新資料,並提交事務

事務A再次讀取該資料,探索資料已經改變了。

 

因為,預設資料庫READ COMMITTED層級,顧名思義,就是可以保證讀取已經提交的資料,防止髒讀。。

如果為了效能考慮,更改了資料庫的配置預設隔離等級為 read uncommitted,就不是這樣的情況了,就發現不了資料的改變了。。

 

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.