序列化(serializable,sqlite預設模式):最高端別的隔離。兩個同時發生的事務100%隔離,每個事務有自己的『世界』。
可重複讀(repeatable read,mysql預設模式):每個事務有自己的『世界』,除了一種情況。如果乙個事務成功執行並且新增了新資料,這些資料對其他正在執行的事務是可見的。
但是如果事務成功修改了一條資料,修改結果對正在執行的事務不可見。所以,事務之間只是在新資料方面突破了隔離,對已存在的資料仍舊隔離。
舉個例子,如果事務a執行」select count(1) from table_x」 ,然後事務b在 table_x 加入一條新資料並提交,當事務a再執行一次 count(1)結果不會是一樣的。 這叫幻讀(phantom read)。
讀取已提交(read committed,oracle、postgresql、sql server預設模式):可重複讀+新的隔離突破。如果事務a讀取了資料d,然後資料d被事務b修改(或刪除)並提交,
事務a再次讀取資料d時資料的變化(或刪除)是可見的。 這叫不可重複讀(non-repeatable read)。
讀取未提交(read uncommitted):最低級別的隔離,是讀取已提交+新的隔離突破。如果事務a讀取了資料d,然後資料d被事務b修改(但並未提交,事務b仍在執行中),
事務a再次讀取資料d時,資料修改是可見的。如果事務b回滾,那麼事務a第二次讀取的資料d是無意義的,因為那是事務b所做的從未發生的修改(已經回滾了嘛)。
這叫髒讀(dirty read)。
從隔離級別低到高,分別是:讀取未提交、讀取已提交、可重複讀、序列化。
總結讀取未提交: 就是只讀取沒有提交的資料
設定資料庫讀取未提交的資料(設定隔離級別):set session transaction isolation level read uncommitted;
讀取提交:
讀取已提交:就是只讀取提交的資料
設定資料庫讀取未提交的資料(設定隔離級別):set session transaction isolation level read committed;
可重複讀:那就是視窗2的事務就算提交了資料修改,我視窗1的事務也不管,還是只讀取到原來的資料。
設定資料庫讀取未提交的資料(設定隔離級別):set session transaction isolation level repeatable read;
序列化:
repeatable read:在mysql中,不會出現幻讀。
資料庫四種隔離級別
存在的問題 更新遺失。解決辦法就是下面的 可讀取未確認 寫事務阻止其他寫事務,避免了更新遺失。但是沒有阻止其他讀事務。存在的問題 髒讀。即讀取到不正確的資料,因為另乙個事務可能還沒提交最終資料,這個讀事務就讀取了中途的資料,這個資料可能是不正確的。解決辦法就是下面的 可讀取確認 寫事務會阻止其他讀寫...
資料庫四種隔離級別
零 沒有併發控制 存在的問題 更新遺失。解決辦法就是下面的 可讀取未確認 一 可讀取未確認 read uncommitted 寫事務阻止其他寫事務,避免了更新遺失。但是沒有阻止其他讀事務。存在的問題 髒讀。即讀取到不正確的資料,因為另乙個事務可能還沒提交最終資料,這個讀事務就讀取了中途的資料,這個資...
資料庫的四種隔離級別
未授權讀取 也稱為讀未提交 read uncommitted 允許髒讀取,但不允許更新丟失。如果乙個事務已經開始寫資料,則另外乙個事務則不允許同時進行寫操作,但允許其他事務讀此行資料。該隔離級別可以通過 排他寫鎖 實現。授權讀取 也稱為讀提交 read committed 允許不可重複讀取,但不允許...