MySQL中的事務隔離級別

2021-04-28 07:37:53 字數 2579 閱讀 3327

sql 標準用三個必須在並行的事務之間避免的現象定義了四個級別的事務隔離。 這些不希望發生的現象是: 

乙個事務讀取了另乙個未提交的並行事務寫的資料。 

乙個事務重新讀取前面讀取過的資料, 發現該資料已經被另乙個已提交的事務修改過。 

乙個事務重新執行乙個查詢,返回一套符合查詢條件的行, 發現這些行因為其他最近提交的事務而發生了改變。

sql 事務隔離級別

離級別髒讀(dirty read)

不可重複讀(nonrepeatable read)

幻讀(phantom read)

讀未提交(read uncommitted)

可能可能

可能讀已提交(read committed)

不可能可能

可能可重複讀(repeatable read)

不可能不可能

可能可序列化(serializable )

不可能不可能

不可能

在mysql中預設事務隔離級別是可重複讀(repeatable read).可通過sql語句查詢:

檢視innodb系統級別的事務隔離級別:

mysql> select @@global.tx_isolation;

結果:

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

| @@global.tx_isolation |

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

| repeatable-read       |

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

1 row in set (0.00 sec)

檢視innodb會話級別的事務隔離級別:

mysql> select @@tx_isolation;

結果:+-----------------+

| @@tx_isolation  |

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

| repeatable-read |

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

1 row in set (0.00 sec)

修改事務隔離級別:

mysql> set global transaction isolation level read committed;

query ok, 0 rows affected (0.00 sec)

mysql> set session transaction isolation level read committed;

query ok, 0 rows affected (0.00 sec)

innodb的可重複讀隔離級別和其他資料庫的可重複讀是有區別的,不會造成幻象讀(phantom read),所謂幻象讀,就是同乙個事務內,多次select,可以讀取到其他session insert並已經commit的資料。下面是乙個小的測試,證明innodb的可重複讀隔離級別不會造成幻象讀。測試涉及兩個session,分別為session 1和session 2,隔離級別都是repeateable read,關閉autocommit

mysql> select @@tx_isolation;

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

| @@tx_isolation  |

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

| repeatable-read |

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

1 row in set (0.00 sec)

mysql> set autocommit=off;

query ok, 0 rows affected (0.00 sec)

session 1 建立表並插入測試資料

mysql> create table

test(i int) engine=innodb;

query ok, 0 rows affected (0.00 sec)

mysql> insert into test values(1);

query ok, 1 row affected (0.00 sec)

session 2 查詢,沒有資料,正常,session1沒有提交,不允許髒讀

mysql> select * from test;

empty set (0.00 sec)

session 1 提交事務

mysql> commit;

query ok, 0 rows affected (0.00 sec)

session 2 查詢,還是沒有資料,沒有產生幻象讀

mysql> select * from test;

empty set (0.00 sec)

以上試驗版本:

mysql> select version();

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

| version()               |

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

| 5.0.37-community-nt-log |

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

1 row in set (0.00 sec)

mysql隔離級別 MySQL 事務隔離級別

mysql innodb所提供的事務滿足acid的要求,事務是通過事務日誌中的redo log和undo log來實現原子性 undo log 一致性 undo log 永續性 redo log 事務通過鎖機制實現隔離性。1 事務隔離級別與實現read uncommitted 讀未提交 read c...

MySQL中的事務隔離級別

mysql中的事務隔離級別 收藏 sql 標準用三個必須在並行的事務之間避免的現象定義了四個級別的事務隔離。這些不希望發生的現象是 髒讀 dirty reads 乙個事務讀取了另乙個未提交的並行事務寫的資料。不可重複讀 non repeatable reads 乙個事務重新讀取前面讀取過的資料,發現...

MySQL中的事務隔離級別

sql標準用三個必須在並行的事務之間避免的現象定義了四個級別的事務隔離。這些可能會出現的現象有 1.b 髒讀 dirty reads b 乙個事務讀物了另乙個未提交的並行事務寫的資料。2.b 不可重複讀 non repeatable reads b 乙個事務重新讀取前面讀取過的資料,發現該資料已經被...