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);
级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
read uncommitted (读未提交) | 是 | 是 | 是 |
read committed (读已提交) | 否 | 是 | 是 |
repeatable read (可重复读) | 否 | 否 | 是 |
Serializable (可串行化) | 否 | 否 | 否 |
read uncommitted (读未提交)
初始数据:
开两个mysql窗口
设置事务级别
Transication A | Transication B |
---|---|
begin | |
![]() | |
![]() | |
commit | |
![]() | ![]() |
rollback:
Transication A | Transication B |
---|---|
begin | |
![]() | |
![]() | |
rollback;![]() | |
![]() |
read committed (读已提交)
设置事务级别
Transication A | Transication B |
---|---|
begin | |
![]() | |
![]() | |
commit | |
![]() | ![]() |
rollback:
Transication A | Transication B |
---|---|
begin | |
![]() | |
![]() | |
rollback;![]() | |
![]() |