数据库事务的隔离级别

0 概述

数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。事务有四个基本特性,即原子性、隔离性、一致性、持久性。本文主要讲述数据库事务的隔离级别。

1 四种隔离级别

SQL标准中定义了四种隔离级别:

  • 未提交读(read uncommitted ):事务中的修改,即使没有提交,对其它事务也是可见的。事务可以读取未提交的数据,也称之为脏读。
  • 提交读(read committed ):只能读取到已经提交的数据,可以避免脏读。
  • 可重复读 (repeatable read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。会出现幻读的情况,所谓的幻读,当某个事务在读取某个某个范围内记录时候,另外一个事务又在改事务内插入了一新记录,当之前的事务再次读取该范围的记录时候就会出现幻读(幻行)。
  • 串行读(Serializable):是最高的隔离级别,通过强制的事务串行执行,避免了前面说的幻读问题。简单的来说,Serializable会在读取的每一行数据上加锁,所以可能导致大量的超时和锁竞争的问题。实际应用中很少用到这一级别。

首先执行sql 看下当前数据库事务隔离的级别 show variables like “%iso%”; 从下图中可以看到当前数据库事务为可重复读(mysq lInnoDB 默认的事务)。
这里写图片描述

2 实例分析

未提交读(read uncommitted ),会产生脏读。
设置数据库事务为未提交读(read uncommitted ),执行如下sql:
set session tx_isolation=‘read-uncommitted’;从下图可以发现插入事务还没有提交,其它的事务已经可以读取到数据(脏读)。
这里写图片描述

提交读(read committed )实例分析:
set session tx_isolation=‘read-committed’; 设置数据事务为提交读。
开启事务:
事务中执行select * from user 有四条记录;然后新开启一个窗口去插入一条数据(事务为提交),然后再来执行select * from user;发现还是四条记录,插入事务提交后再来执行select * from user; 就会发现有五条。
这里写图片描述
插入数据事务:
这里写图片描述

可重复读实例分析:
开启事务:
事务中执行select * from user 有三条记录;然后新开启一个窗口去插入一条数据,然后再来执行select * from user;发现还是三条记录,这是因为事务级别是可重复读,其实这也产生了幻读。
这里写图片描述
插入数据:
这里写图片描述

串行读(Serializable)实例
set session tx_isolation=“Serializable”;

先开启一个事务:
这里写图片描述
打开一个新的窗口,set session tx_isolation=“Serializable”;
再开启一个事务,可见插入在被阻塞了。
这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值