MySQL-8.0 事務隔離級別


查看數據庫事務隔離級別

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;
image -
- image
image -
- commit
image -
  • 事務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操作,本事務會阻塞,直到其他事務釋放鎖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM