Atitit.數據庫事務隔離級別
1. 事務隔離級別的作用 1
2. 在的隔離級別 2
3. 常見數據庫的默許管理級別 3
較低的隔離級別可以增強許多用戶同時訪問數據的能力,但也增加了用戶可能遇到的并發副作用(例如臟讀或丟失更新)的數量。相反,較高的隔離級別減少了用戶 可能遇到的并發副作用的類型,但需要更多的系統資源,并增加了1個事務阻塞其他事務的可能性。應平衡利用程序的數據完全性要求與每一個隔離級別的開消,在此 基礎上選擇相應的隔離級別。最高隔離級別(可序列化)保證事務在每次重復讀取操作時都能準確檢索到相同的數據,但需要通過履行某種級別的鎖定來完成此操 作,而鎖定可能會影響多用戶系統中的其他用戶。最低隔離級別(未提交讀)可以檢索其他事務已修改、但未提交的數據。在未提交讀中,所有并發副作用都可能 產生,但由于沒有讀取鎖定或版本控制,所以開消最少
作者:: 老哇的爪子 Attilax 艾龍, EMAIL:1466519819@qq.com
轉載請注明來源: http://blog.csdn.net/attilax
當多個事務同時進行時,通過設置隔離級別來處理臟讀、不可重復讀、幻讀事件
read uncommitted | 0 未提交讀
將查詢的隔離級別指定為 0。
可以讀臟數據
讀臟數據:1事務對數據進行了增刪改,但未提交,有可能回滾,另外一事務卻讀取了未提交的數據
read committed | 1 已提交讀
將查詢的隔離級別指定為 1。
避免臟讀,但可以出現不可重復讀和幻讀
不可重復讀:1事務對數據進行了更新或刪除操作,另外一事務兩次查詢的數據不1致
幻像讀:1事務對數據進行了新增操作,另外一事務兩次查詢的數據不1致
repeatable read | 2 可重復讀
將查詢的事務隔離級別指定為 2。
避免臟讀,不可重復讀,允許幻像讀
serializable | 3 可序列化
將查詢的隔離級別指定為 3。
串行化讀,事務只能1個1個履行,避免了臟讀、不可重復讀、幻讀
履行效力慢(我遇到過1種情況,用時是隔離級別1的30倍),使用時慎重
SNAPSHOT
當讀取數據時,可以保證讀操作讀取的行是事務開始時可用的最后提交版本。
這意味著這類隔離級別可以保證讀取的是已提交過的數據,并且可以實現可重復讀,
也能確保不會幻讀。不過這類隔離級別使用的不是同享鎖,而是行版本控制。
SQL Server 2005以后的版本支持。
下表顯示了不同隔離級別允許的并發副作用。
隔離級別 |
臟讀 |
不可重復讀 |
虛擬讀取 |
未提交讀 |
是 |
是 |
是 |
已提交讀 |
否 |
是 |
是 |
可重復讀 |
否 |
否 |
是 |
快照 |
否 |
否 |
否 |
可序列化 |
否 |
否 |
否 |
EAD UNCOMMITTED 指定語句可以讀取已由其他事務修改但還沒有提交的行。 在 READ UNCOMMITTED 級別運行的事務,不會發出同享鎖來避免其他事務修改當前事務讀取的數據。READ UNCOMMITTED 事務也不會被排他鎖阻塞,排他鎖會制止當前事務讀取其他事務已修改但還沒有提交的行。設置此選項以后,可以讀取未提交的修改,這類讀取稱為臟讀。在事務結束 之前,可以更改數據中的值,行也能夠出現在數據集中或從數據集中消失。該選項的作用與在事務內所有 SELECT 語句中的所有表上設置 NOLOCK 相同。這是隔離級別中限制最少的級別。
READ COMMITTED 指定語句不能讀取已由其他事務修改但還沒有提交的數據。這樣可以免臟讀。其他事務可以在當前事務的各個語句之間更改數據,從而產生不可重復讀取和幻像數據。該選項是 SQL Server 的默許設置。
REPEATABLE READ 指定語句不能讀取已由其他事務修改但還沒有提交的行,并且指定,其他任何事務都不能在當前事務完成之前修改由當前事務讀取的數據。 對事務中的每一個語句所讀取的全部數據都設置了同享鎖,并且該同享鎖1直保持到事務完成為止。這樣可以避免其他事務修改當前事務讀取的任何行。其他事務可以 插入與當前事務所發出語句的搜索條件相匹配的新行。如果當前事務隨后重試履行該語句,它會檢索新行,從而產生幻讀。由于同享鎖1直保持到事務結束,而不是 在每一個語句結束時釋放,所以并發級別低于默許的 READ COMMITTED 隔離級別。此選項只在必要時使用。
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里默許的1致讀對
Oralce_MySQL默許隔離級別對照 - Oracle - 次元立方網 - 電腦知識與技術互動交換平臺.htm
隔離級別_百度百科.htm
這個觸及到數據庫的隔離級別。默許情況下,oracle,mssql,mysql都是READ COMMITTED隔離級別來訪問數據
你這個原理是這樣::
事務A,打開 ,然后讀取了數據,此時還沒有提交A事務
事務B緊接的更新數據,并提交事務
事務A再次讀取該數據,發現數據已改變了。
由于,默許數據庫READ COMMITTED級別,顧名思義,就是可以保證讀取已提交的數據,避免臟讀。。
如果為了性能斟酌,更改了數據庫的配置默許隔離級別為 read uncommitted,就不是這樣的情況了,就發現不了數據的改變了。。
上一篇 Oracle正則表達式實戰
下一篇 2014年年終總結