事務的隔離級別 為什麼 引入了 事務隔離級別?? 在資料庫操作中,為了有效保證併發讀取數據的正確性,提出的事務隔離級別。 更新丟失兩個事務都同時更新一行數據,一個事務對數據的更新把另一個事務對數據的更新覆蓋了。這是因為系統沒有執行任何的鎖操作,因此併發事務並沒有被隔離開來。臟讀一個事務讀取到了另一個 ...
事務的隔離級別
為什麼 引入了 事務隔離級別??
在資料庫操作中,為了有效保證併發讀取數據的正確性,提出的事務隔離級別。
更新丟失
兩個事務都同時更新一行數據,一個事務對數據的更新把另一個事務對數據的更新覆蓋了。這是因為系統沒有執行任何的鎖操作,因此併發事務並沒有被隔離開來。
臟讀
一個事務讀取到了另一個事務未提交的數據操作結果。這是相當危險的,因為很可能所有的操作都被回滾。
不可重覆讀
不可重覆讀(Non-repeatable Reads):一個事務對同一行數據重覆讀取兩次,但是卻得到了不同的結果。
包括以下情況:
(1)虛讀:事務T1讀取某一數據後,事務T2對其做了修改,當事務T1再次讀該數據時得到與前一次不同的值。
(2) 幻讀(Phantom Reads):事務在操作過程中進行兩次查詢,第二次查詢的結果包含了第一次查詢中未出現的數據或者缺少了第一次查詢中出現的數據(這裡並不要求兩次查詢的SQL語句相同)。這是因為在兩次查詢過程中有另外一個事務插入數據造成的。
解決方案: 使用事務隔離級別
案例一: 允許臟讀取
-- 查詢mysql預設的事務隔離級別 (可重覆讀取 repeatable-read )
SELECT @@tx_isolation;
-- 修改事務 隔離級別
SET tx_isolation='read-uncommitted'; 允許臟讀取,不允許更新丟失
案例二: 禁止更新丟失
在doc視窗中
bengin
update 一張表的數據
不回滾 也不 提交
在 sqlyong中
操作同一張表,發現不允許,在等待!