事務的隔離級別和引發的問題

2021-09-29 13:59:23 字數 2550 閱讀 7069

以mysql為例:

查詢當前事務的隔離級別用

select @@tx_isolation;

設定隔離級別用 set session transaction isolation level [隔離級別];

例如: set session transaction isolation level read uncommitted;

如果是設定全域性的事務隔離級別用set global transaction isolation level [隔離級別];

例如:set global transaction isolation level read uncommitted;

mysql的預設隔離級別為 repeatable read可重複讀

oracle的預設隔離級別為read committed;讀已提交

四種隔離級別:

read uncommitted:未提交讀   

read committed :已提交讀(oracle預設)

repeatable read:可重複讀(mysql預設)

serializable:序列化

我們將左邊的隔離級別設定為未提交讀

可以看到,左右都開啟了事務,但是右邊更新資料之後還沒有提交,左邊就可以讀取到右邊為提交的資料

這就會引發髒讀的問題

我們將左邊的隔離級別設定為提交讀

可以看到,左右都開啟了事務,但是右邊更新的資料之後還沒有提交,左邊就不可以讀取到右邊未提交的資料

只有等右邊的資料提交了,左邊才能讀取到

但是這樣又有乙個問題,就是左邊還未提交,就能讀取到另乙個事務提交的資料

這就會引發不可重複讀的問題

左邊資料太長了,只能擷取一部分

我們將左邊的隔離級別設定為可重複讀

可以看到,左右都開啟了事務,右邊事務提交後的資料,只有左邊的事務也提交之後才可以讀取到

我們將左邊的隔離級別設定為序列化

我們這裡先在左邊開啟事務,我們可以看到第一張圖,左邊事務先開啟,右邊的插入資料就無法執行

只有等左邊的事務提交了,右邊才能進行插入事務,如圖二

假如我們將右邊事務先開啟,那麼只有等右邊的事務提交了,左邊的操作才能進行

髒讀:乙個事務讀取到了另乙個事務為提交的內容,例如隔離級別為未提交讀

不可重複讀:乙個事務讀取到了另乙個事務提交的資料,導致前後兩次查詢結果不一致,例如隔離級別為提交讀

幻讀:乙個事務讀取到另乙個事務插入的資料,導致多次查詢的結果不一致。也就是說第一次查詢有n條記錄,第二次查詢有n+1條資料,看起來就像產生幻覺(mysql資料庫沒辦法演示幻讀)

未提交讀》提交讀》可重複讀》序列化

一般引發寫的問題就是丟失更新的資料

事務a,b開啟事務後同時查詢

然後事務a先對事務進行更新,事務b對事務後更新引發的問題

解決的方法一般兩個:悲觀鎖和樂觀鎖

一般認為丟失更新一定會發生

在查詢的時候加上字段 for update 

a事務的查詢加上for update後,b事務的介面就會卡主,拿不了資料,只能等a資料提交後才能拿資料

這樣就保證了資料a提交的資料不會丟失

認為不會發生丟失更新,一般有程式設計師手動增加任意字段,一般加上version

例如程式設計師手動加上了version欄位,初始欄位為version(0)

那麼a事務和b事務一開始的version(0)

然後a事務修改了資料並提交,version(0)就會變成version(1),

b事務進行操作的時候發現version的值改變了,便會從資料庫中重新查詢資料

這樣也能保證資料不會更新丟失。

行鎖就是將我們要操作的行鎖住,其他事務無法去進行增刪改的操作

表鎖就是我們將整個表鎖住,使得其他事務無法對我們的表進行操作

行鎖和表鎖都涉及到了排他鎖,for update ,在開啟事務後如果對行進行上鎖,就是行鎖,對錶進行操作就是表鎖。

事務的隔離級別及引發的問題

1.4個隔離級別 2.讀未提交.讀已提交,可重複讀.序列化 3.分別怎麼理解呢?a.讀未提交 readuncommitted 事務中的修改,即使沒有提交,對其他事物也是可見的.b.讀已提交 read committed 乙個事物讀取已經提交的事務所做的修改,不能讀取未提交的事務所做的修改,也及時事務...

事務的隔離級別舉例 事務的隔離級別

乙個事務是乙個完整的業務邏輯單元,不能再分,要麼全部執行成功,要麼全部失敗。比如 a給b轉賬100元,a的銀行卡就會少100元,b的銀行卡就會多100元,整個過程要麼全部執行成功,要麼全部失敗。a 原子性。事務是最小的業務邏輯單元。b 一致性。乙個事務必須保證多條dml語句同時成功或失敗。c 隔離性...

事務的隔離級別舉例 JDBC 事務隔離級別

本文總結了 jdbc 事務隔離級別。事務隔離級別定義了在乙個事務中,哪些資料是對當前執行的語句 可見 的。在併發訪問資料庫時,事務隔離級別定義了多個事務之間對於同個目標資料來源訪問時的可交叉程度。可交叉程度可分為以下幾類。可交叉程度 dirty reads 髒讀 當乙個事務能看見另外乙個事務未提交的...