mysql innodb 存储引擎的事务隔离级别

事务隔离级别

read uncommitted(未提交读),导致脏读。
read committed(提交度),导致不可重复读。
repeatable read(可重复读),导致幻读。
serializable(序列化), 效率过低。

我们的隔离级别都是针对多个事务操作同一数据来定义的,比如未提交读,那就是当前事务设置未提交读,那么其他事务在事务中未commit的数据当前事务可以读取。

默认的事务隔离级别是 repeatable read

mysql> show variables like ‘%isolation%‘ ;
+-----------------------+-----------------+
| Variable_name         | Value           |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
| tx_isolation          | REPEATABLE-READ |
+-----------------------+-----------------+

表结构

create table

create table student(
 id int primary key,
 name varchar(255)

);
insert into student values(1,‘student1‘);

select * from student;

read uncommitted(未提交读)

事务A

set session transaction isolation level read uncommitted;
start transaction;
select * from student;

事务B

set session transaction isolation level read uncommitted;
set session transaction isolation level read committed;
set session transaction isolation level repeatable read;
set session transaction isolation level serializable;

start transaction;
update student set name =‘student2‘ where id = 1;
select *  from student ;
rollback;

只要事务A的隔离级别为 read uncommitted,事务B的隔离级别为任意级别,A都会脏读。

serializable(序列化)

事务B阻塞

事务A 后执行

set session transaction isolation level serializable;
start transaction;
select * from student;

事务B 后执行

update student set name =‘student2‘ where id = 1;  --将会阻塞

事务A阻塞

事务B 后执行

start transaction;
update student set name =‘student2‘ where id = 1;  

事务A 后执行

set session transaction isolation level serializable;
start transaction;
select * from student; --将会阻塞

总结

事务 A B 事务A sql执行结果
隔离级别 read uncommitted 任意 A读取出B事务中未提交的数据
隔离级别 read uncommitted 任意 A没有读出B事务中未提交的数据
隔离级别 repeatable read 任意 A没有读出B事务中未提交的数据,并且在A开启事务后查询,无论B事务是否提交,读取的结果都是一致的。
隔离级别 serializable 任意 A没有读取B事务中未提交的数据,并且在A开启事务查询后, B事务的更新相关数据会阻塞。B事务开启事务后并更新数据,A读取相关数据会阻塞。

read uncommitted ,read uncommitted 都是读取数据,其他事务的操作级别对其读取不会造成阻塞。
serializable 可能由于其他事务更新数据,导致当前读取,更新相关数据 阻塞。

mysql innodb 存储引擎的事务隔离级别

上一篇:ASP.Net Core -- 领域模型与数据库架构保持同步


下一篇:【机器学习 Azure Machine Learning】Azure Machine Learning 访问SQL Server 无法写入问题 (使用微软Python AML Core SDK)