查看數據庫事務隔離級別
mysql> show variables like 'transaction%';
mysql> select @@transaction_isolation;
mysql> SELECT @@GLOBAL.transaction_isolation, @@GLOBAL.transaction_read_only;
mysql> SELECT @@SESSION.transaction_isolation, @@SESSION.transaction_read_only;
修改事務隔離級別的方式
- 由低到高分別為
- read uncommitted (讀未提交)
- read committed (讀提交)
- repeatable read (重復)
- Serializable (序列化)
1.只在本次會話有效
mysql> set session transaction isolation level read committed;
2.設置全局的事務隔離級別,該設置不會影響當前已經連接的會話,新會話,將使用新設置的事務隔離級別
mysql> set global transaction isolation level read committed;
3.修改配置文件,重啟后生效
[mysqld]
transaction-isolation = REPEATABLE-READ
transaction-read-only = OFF
select id,name,count from ent_stock;
select id,name,count from ent_stock lock in share mode;
update ent_stock s set s.count = s.count-1 where s.name = '庫存-1';
insert into ent_stock(id,name,count) values(uuid(),'庫存-3',1000);
| 級別 | 臟讀 | 不可重復讀 | 幻讀 |
|---|---|---|---|
| ru | 是 | 是 | 是 |
| rc | 否 | 是 | 是 |
| rr | 否 | 否 | 是 |
| ru | 否 | 否 | 否 |
- Read-Uncommitted
| Transication A | Transication B |
|---|---|
| begin; | begin; |
![]() |
- |
| - | ![]() |
![]() |
- |
| - | commit; |
![]() |
- |
- Read-Committed(不可重復讀)
1.解決臟讀
| Transication A | Transication B |
|---|---|
| begin; | begin; |
![]() |
- |
| - | ![]() |
![]() |
- |
| - | commit; |
![]() |
- |
- Repeatable Read(可重復讀)
| Transication A | Transication B |
|---|---|
| begin; | begin; |
![]() |
- |
| - | ![]() |
![]() |
- |
| - | commit |
![]() |
- |
- 事務A: update ent_stock s set s.count = count-1 where s.name = '庫存-1';
- 事務B: update ent_stock s set s.count = count-1 where s.name = '庫存-1';
- 事務A給庫存-1加了X鎖,事務B更新時只能阻塞等待事務A提交后才可提交此次更新,反之同理
- 普通select是查詢快照讀,select ... lock in share mode 使用當前讀,當其他事務有update操作,本事務會阻塞,直到其他事務釋放鎖






