您的位置:首页 > 数据库

数据库事务的隔离级别

2017-08-29 23:22 295 查看

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”;

再开启一个事务,可见插入在被阻塞了。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: