这是我参与11月更文挑战的第9天,活动详情查看:2021最后一次更文挑战
-
-
-
事务隔离级别:
-
读未提交:read uncommitted ;
- 描述:(最低事务隔离级别)事务A可以读取到事务B未提交的数据
- 存在问题:脏读现象(dirty read)称读到了脏数据(未提交的数据),基本不用
-
读已提交:read committed ;
- 描述:事务A只能读取到事务B提交之后的数据
- 解决问题:解决了脏读现象
- 存在问题:不可重复读取数据
- 数据100% 的真实。是oracle数据库默认的事务隔离级别
-
可重复读:repeatable read ;
-
描述:事务A开启之后,读取到的事务B中的数据都是一致的。即使在A开启后B事务的数据修改并且提交了,事务A读取到的数据还是不变
相当于把表复制了一份,使用复印件进行操作。退出事务之后再次查询,或者开启新的事务,数据才会更新。
-
解决问题:解决了不可重复读取数据的问题
-
存在问题:可能会出现幻影读现象(读取到的数据都是幻象,数据不真实)
-
是 mysql 中默认的事务隔离级别
-
-
-
序列化 / 串行化:serializable ;
- 描述:(最高事务隔离级别,效率最低),表示事务排队。类似于synchronized(线程同步)
- 解决问题:解决了所有级别
- 存在问题:效率最低
-
- 持久性:事务最终结束的一个保障
查看隔离级别:select @@transaction_isolation ;;
-
以下四个是测试数据,测试的时候1 , 2 , 4分别对3。
【案例】:验证read uncommited
drop table if exists t_user ;
create table t_user(
name varchar(255)
);
select @@transaction_isolation ;
set session transaction isolation level read uncommitted ; // 设置全局事务的隔离级别
select @@transaction_isolation ;
use test ;
start trabsaction ;
select * from t_user ;
【案例】:验证read commited
drop table if exists t_user ;
create table t_user(
name varchar(255)
);
select @@transaction_isolation ;
set session transaction isolation level read committed ; // 设置全局事务的隔离级别
select @@transaction_isolation ;
use test ;
start trabsaction ;
select * from t_user ;
insert into t_user (name) values ('zhangsan');
【案例】:验证repeatable read
drop table if exists t_user ;
create table t_user(
name varchar(255)
);
select @@transaction_isolation ;
use test ;
select * from t_user ;
insert into t_user (name) values ('zhangsan');
【案例】:验证serializable
drop table if exists t_user ;
create table t_user(
name varchar(255)
);
select @@transaction_isolation ;
set session transaction isolation level serializable ; // 设置全局事务的隔离级别
select @@transaction_isolation ;
use test ;
select * from t_user ;
insert into t_user (name) values ('zhangsan');