資料庫事物隔離四種級別詳解

2021-07-27 04:17:44 字數 3695 閱讀 5175

資料庫事物隔離級別有四種,按照隔離性,由低到高依次是:1.read uncommitted

2.read committed

3.repeatable read

4.serializable

按照併發性則順序相反。

√: 可能出現    ×: 不會出現

髒讀不可重複讀

幻讀read uncommitted(未提交讀)√√

√read committed(已提交讀)×√

√repeatable read(可重複讀)××

√serializable(可序列化)××

× 1.read uncommitted

讀未提交,即在sql查詢中,讀取了未提交的資料。在mysql中,預設的事物級別是repeatable read;預設自動提交模式是開啟的,現做如下修改如下所示,

(1)關閉自動提交   

mysql

> show variables like

'autocommit';

+---------------+-------+

| variable_name | value |+--

-------------+-------+

| autocommit |on|

+---------------+-------+

1 row in

set (0.00

sec)

mysql

>

set autocommit =0;

query ok,

0 rows affected (0.00

sec)

mysql

> show variables like

'autocommit';

+---------------+-------+

| variable_name | value |+--

-------------+-------+

| autocommit |

off|+--

-------------+-------+

1 row in

set (0.01 sec)

(2)修改事物級別為read uncommitted

mysql> show variables like

'tx_isolation';

+---------------+-----------------+

| variable_name | value |+--

-------------+-----------------+

| tx_isolation |

repeatable

-read|+

---------------+-----------------+

1 row in

set (0.00 sec)

mysql> set session transaction isolation level read uncommitted;

query ok, 0 rows affected (0.00 sec)

mysql> set global transaction isolation level read uncommitted;

query ok, 0 rows affected (0.00 sec)

當前開啟了兩個session,在第乙個,往表test中插入了一行資料,但是還沒有提交,此時通過第二個session可以查詢到該條資料。 

且當第乙個session中的事物rollback之後,第二個session又查詢不到新插入的資料『3』

讀提交,修改事物幾倍為read committed      

mysql>

set session transaction

isolation

level

read

committed

;query ok,

0 rows affected (0.00

sec)

mysql

>

set global transaction

isolation

level

read

committed

;query ok,

0 rows affected (0.00 sec)

此時,在session0中插入了一條資料且未commit,在session1中無法查詢到    

等session0在commit之後,session1可以正常的查詢到資料

可重複讀,此時修改事物級別為可重複讀

mysql>

set session transaction

isolation

level

repeatable

read

;query ok,

0 rows affected (0.00

sec)

mysql

>

set global transaction

isolation

level

repeatable

read

;query ok,

0 rows affected (0.00 sec)

此時,test表中存在兩筆資料:2和4,如下所示   

mysql>

select

*from test where col1

';+--

----+

| col1 |+--

----+|2

||4|

+------+

2 rows in

set (0.00 sec)

此時步驟如下:1.在session0中begin乙個事物;

2.在session1中插入一條資料(5),並commit;

3.在session0中查詢,發現查詢不到在session1中插入的資料

接下來,再做如下操作:1.在session0中commit;

2.在session0中再做查詢操作,發現之前在session1中insert的5又可以查詢到

可序列話,是最高的隔離級別,即在讀取的每一行資料上會加鎖,事物順序執行。所以會出現鎖超時等問題,在實際業務中很少使用。

資料庫事物隔離四種級別詳解

資料庫事物隔離級別有四種,按照隔離性,由低到高依次是 1.read uncommitted 2.read committed 3.repeatable read 4.serializable 按照併發性則順序相反。可能出現 不會出現 髒讀不可重複讀 幻讀read uncommitted 未提交讀 r...

資料庫四種事務隔離級別詳解

四種資料庫隔離級別及解決的資料問題如下所示 1.read uncommitted 讀取未提交內容 由於在該隔離級別下即使事務未提交所做的修改也會對其他事務產生影響。所以該級別會出現資料髒讀的發生。髒讀 乙個事務讀取了另乙個未提交的並行事務寫的資料。鎖情況 事務在讀取資料的時候並未對資料加鎖。在修改資...

資料庫四種隔離級別

存在的問題 更新遺失。解決辦法就是下面的 可讀取未確認 寫事務阻止其他寫事務,避免了更新遺失。但是沒有阻止其他讀事務。存在的問題 髒讀。即讀取到不正確的資料,因為另乙個事務可能還沒提交最終資料,這個讀事務就讀取了中途的資料,這個資料可能是不正確的。解決辦法就是下面的 可讀取確認 寫事務會阻止其他讀寫...