- 事务隔离级别:
- 读未提交: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');