資料庫事務和隔離級別
事務資料庫事務是指作為單個邏輯工作單元執行的一系列操作,要麼完全的執行,要麼完全的不執行。一方面,當多個應用程式併發訪問資料庫時,事務可以在應用程式間提供乙個隔離方法,防止互相干擾。另一方面,事務為資料庫提供了乙個從失敗恢復正常的方法。
事務具有四個特性:
原子性(atomicity)、
一致性(consistency)、
隔離性(isolation)、
永續性(durability),
簡稱acid
<1>原子性:
是指事務中的操作不可拆分,只允許全部執行或者全部不執行
<2>一致性:
是指事務的執行不能破壞資料庫的一致性,一致性也稱完整性。乙個事務在執行後,資料庫必須從乙個一致性狀態轉變為另乙個一致性狀態。
<3>隔離性:
是指併發的事務相互隔離,不能互相干擾。
<4>永續性:
是指事務一旦提交,對資料庫的更改狀態將被永久的儲存。
隔離級別:
資料庫的事務隔離級別有四個,由低到高分別是read uncommitted、read committed、repeatable read、serializable,這四個級別可以逐個解決髒讀、不可重複讀、幻讀這幾類問題。
√: 可能出現 ×: 不會出現 髒讀
不可重複讀
幻讀readuncommitted√√
√read committed×√
√repeatable read××
√serializable××
×注意:我們討論事務隔離級別的場景,主要是在多個事務併發的情況下。
read uncommitted 讀未提交:
髒讀:乙個事務讀到另乙個事務未提交的更新資料
例:公司發工資了,領導把5000元打到singo的賬號上,但是該事務並未提交,而singo正好去檢視賬戶,發現工資已經到賬,是5000元整,非常高 興。可是不幸的是,領導發現發給singo的工資金額不對,是2000元,於是迅速回滾了事務,修改金額後,將事務提交,最後singo實際的工資只有 2000元,singo空歡喜一場。
當隔離級別設定為read uncommitted 時,就可能出現髒讀。
read committed 讀提交:
不可重複讀:指在乙個事務內多次讀取同乙個資料。在這個事務還沒有結束時,另外乙個事務也訪問同乙個資料。在第乙個事務多次讀取資料之間,另外乙個事務對資料進行了修改,並提交了事務,那麼第乙個事務在多次讀取資料時,發現資料不一致。
當資料庫級別為read committed的時候回避免髒讀,但是會造成不可重複讀。
oracle預設隔離級別 read committed。
repeatable read 重複讀:
幻讀:事務a在執行讀取操作,第一次查詢資料總量後,事務b執行了一條新增的操作後並提交了事務,這時事務a再次讀取資料發現讀取到的資料和之前的不一樣了,就像產生幻覺一樣。
repeatable read避免了不可重複讀,但是可能出現幻讀。
mysql預設隔離級別
serializable 序列化:
serializable 是最高的事務隔離級別,同時代價也花費最高,效能很低,一般很少使用,在該級別下,事務順序執行,不僅可以避免髒讀、不可重複讀,還避免了幻像讀。
如有總結不當,有問題,錯誤的地方請大家予以指正,共同學習,共同進步
mysql資料庫事務隔離級別
1修改事務隔離級別 全域性修改 修改mysql.ini配置檔案 mysqlid transaction isolation repeatble read 對當前session修改 登入mysql客戶端後,執行命令set session transaction isolation level read...
MYSQL 資料庫 事務 隔離級別
定義 在資料庫 中,為了有效保證併發讀取資料的正確性,提出的事務隔離級別,由低到高依次為 1 read uncommitted 未授權讀取 讀未提交 2 read committed 授權讀取 讀提交 3 repeatable read 可重複讀取 4 serializable 序列化 這四個事務隔...
MySQL資料庫事務隔離級別
一 資料庫事務併發訪問引發的問題 二 mysql資料庫的四種事務隔離級別 隔離級別 名稱髒讀 不可重複讀 幻讀資料庫預設級別 read uncommitted 讀未提交是是 是read committed 讀已提交否是 是oracle sql server repeatable read 可重複讀否...