資料庫事物隔離級別有四種,按照隔離性,由低到高依次是:1.Read Uncommitted 2.Read Committed 3.Repeatable Read 4.Serializable 按照併發性則順序相反。 √: 可能出現 ×: 不會出現 1.Read uncommitted 讀未提交,即在 ...
資料庫事物隔離級別有四種,按照隔離性,由低到高依次是: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’
2.Read Committed
讀提交,修改事物幾倍為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可以正常的查詢到數據
3.Repeatable read
可重覆讀,此時修改事物級別為可重覆讀
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 <'5'; +------+ | 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又可以查詢到
4.Serializable
可串列話,是最高的隔離級別,即在讀取的每一行數據上會加鎖,事物順序執行。所以會出現鎖超時等問題,在實際業務中很少使用。