事务隔离级别理解

主要参考博客:http://www.cnblogs.com/zhoujinyi/p/3437475.html

基本隔离级别
简介

===========================================================================================

隔离级别               脏读(Dirty Read)          不可重复读(NonRepeatable Read)     幻读(Phantom Read)

===========================================================================================

未提交读(Read uncommitted)        可能                            可能                       可能

已提交读(Read committed)          不可能                          可能                        可能

可重复读(Repeatable read)          不可能                          不可能                     可能

可串行化(Serializable )         
      不可能                          不可能                     不可能

===========================================================================================

数据准备

新建Student表。

  1. CREATE TABLE `student` (
  2.  `id` int(8) NOT NULL AUTO_INCREMENT,
  3.  `name` varchar(120) DEFAULT NULL,
  4.  `class` varchar(120) DEFAULT NULL,
  5.  PRIMARY KEY (`id`)
  6. ) ENGINE=InnoDB DEFAULT CHARSET=latin1

引擎采用InnoDB,InnoDB默认采用可重复读的隔离级别。

隔离级别基本理解

未提交读(Read uncommitted):允许脏读,就是可能读取到其他回话中未提交事务修改的数据。个人觉得可以理解为读取未提交数据。

提交读(Read committed):只能读取到已经提交事务的数据。Oracle数据库的默认级别。

可重复读(Repeatable read):可重复读。  同一个事务的查询都是同事务开始时刻一致。InnoDB默认级别,该级别消除了不可重复读,但是存在幻读。

可串行化(Serializable)  :完全串行化的读,每次读都会获取表级共享锁。

隔离级别简介
脏读

1, 脏读:一个会话中的事务访问数据,并对数据进行了修改,事务未提交的时候,另一个事务也可以访问这个数据。

2,场景

首先查看数据库事务级别:

  1. select @@global.tx_isolation;

结果:

  1. REPEATABLE-READ

在session1中执行如下操作:

  1. start transaction;;
  2. insert into student(id, class, name)values(null, 1, ‘a1‘);

事务未提交。

在session2中执行查询操作,因为默认事务级别是REPEATABLE-READ,所以不会查到数据。

  1. select * from student

再返回session1中,执行

  1. COMMIT;

session2,中查询即可查询到数据。

在此级别中避免了脏读,但是如果事务级别是在未提交读(Read uncommitted),则可以查询到数据,产生脏读。

不可重复读

1,不可重复读:是指在一个事务内,多次读同一个数据。在这个事务还没有结束的时候,另一个事务也访问了该数据。那么第一个事务中两次读数据之间,由于第二个事务的更改,可能导致第一个事务两次的数据是不一致的。这样子就导致一次事务内两次读取到的数据是不一致的不可重复读。

2,场景。

可重复读

1,可重复读:与不可重复读相反,一个事务内部,多次读取同一个事务,保证数据读取一致。

2,场景

查看数据库隔离级别:

  1. select @@global.tx_isolation;

查询结果:

  1. REPEATABLE-READ

session 1:开启事务,并查询数据:

  1. start TRANSACTION;
  2. select * from student;

查询结果:

  1. 1 a1 1

session2:开启事务,修改学生姓名为a2并提交事务。

  1. start TRANSACTION;
  2. update student set name = ‘a2‘ where id = 1;
  3. commit;

session1:再次执行查询:

  1. 1 a1 1

查询结果与之前保持一致。

session1:事务提交,并执行查询。

  1. commit;
  2. select * from student;

查询结果:

  1. 1 a2 1

如上我们可以看到,查询结果和数据库保持一致。

幻读

1,幻读:第一个事务对表中的数据进行了修改,这种修改涉及到修改表中所有数据行,同时第二个事务向表中插入一行数据。那么,以后第一个事务就会发现,存在数据行未修改,好像产生幻读一样。

2,场景

查看数据库的事务策略

  1. select @@global.tx_isolation;

结果:

  1. REPEATABLE-READ

session1:启动事务,并修改表中所有数据name为a3。

  1. start TRANSACTION;
  2. update student set name = ‘a3‘;

session2:启动事务,插入一条新纪录。并提交事务。

  1. start TRANSACTION;
  2. insert into student values(null, ‘a2‘, 1);

在执行此时,会发现数据库执行会等待之前语句执行,而不会发生如之前版本的幻读。

session1:执行commit。

  1. commit;

发现session2,的语句执行结束。session2 事务commit。

本人使用的数据库版本为:Mysql 5.6。并未发生幻读现象。

如上即为四中事务隔离级别的基本理解。

版权声明:本文为博主原创文章,未经博主允许不得转载。如有问题,欢迎交流。

时间: 2024-10-10 05:13:55

事务隔离级别理解的相关文章

数据库:自己理解的“数据库事务隔离级别”

转载请注明出处: jiq?钦's technical Blog - 季义钦 引言:在网上搜了很多关于事务的文章,感觉单独来看都很难看懂,所以综合自己的理解写一篇我自己能理解的关于关系型数据库事务的文章. 一.事务特征 我们都知道数据库事务具备ACID特性: Atomic(原子性):一个事务要么成功,要么失败 Consistency(一致性):一致性代表了底层数据存储的完整性.事务执行前后数据库都必须处于一个合法的状态.什么才是一个合法的状态? 比如满足数据库的唯一性约束.数据类型验证.引用完整性

SQL Server 中的事务与事务隔离级别以及如何理解脏读, 未提交读,不可重复读和幻读产生的过程和原因

原本打算写有关 SSIS Package 中的事务控制过程的,但是发现很多基本的概念还是需要有 SQL Server 事务和事务的隔离级别做基础铺垫.所以花了点时间,把 SQL Server 数据库中的事务概念,ACID 原则,事务中常见的问题,问题造成的原因和事务隔离级别等这些方面的知识好好的整理了一下. 其实有关 SQL Server 中的事务,说实话因为内容太多, 话题太广,稍微力度控制不好就超过了我目前知识能力范围,就不是三言两语能够讲清楚的.所以希望大家能够指出其中总结的不足之处,对我

理解数据库事务隔离级别以及脏读, 不可重复读, 幻读(转)

  转自:http://blog.csdn.net/sunxing007/article/details/6427290 数据库事务的4个特性: 原子性(atomic): 都成功或者都失败: 一致性(consistency):事务操作之后,数据库所处的状态和业务规则是一致的;比如a,b账户相互转账之后,总金额不变: 隔离性(isolation):操作中的事务不相互影响; 持久性(durability):事务提交后被持久化到数据库. 脏读,不可重复读, 幻读 幻读phantom read:事务1读

理解MySql的锁&事务隔离级别

这几篇文章是从网上(http://www.hollischuang.com)看到的一系列文章,也是重温了一下数据库的相关知识.下面是对这些文章的一些前后行文逻辑的说明: 我们知道,在DBMS的多个事业并发执行时,存在着脏读.不可重复读.幻读等情况. 为了解决这些问题,DBMS产品都会通过锁来实现数据库隔离级别从而解决上面的问题. 数据库的读现象浅析 :分析了脏读 & 不可重复读 & 幻读等情况. 数据库的锁机制 : 分析了常见的锁机制,划分了常见的锁分类. MySQL中的行级锁,表级锁,页

脏读|不可重复度|幻读的理解以及Spring定义的五种事务隔离级别

在Spring中定义了5中不同的事务隔离级别. 1. ISOLATION_DEFAULT(一般情况下使用这种配置既可) 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别. 2. ISOLATION_READ_UNCOMMITTED 这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据.这种隔离级别会产生脏读,不可重复读和幻像读. (大部分数据库缺省的事物隔离级别都不会出现这种状况) 3. ISOLATION_READ_CO

深入理解mysql事务隔离级别

mysql支持4种事务隔离级别分别为 Read Uncommitted 读未提交 Read Committed 读已提交 Repeatable Read 可重复读 *注意这个概念容易混,下面细说 Serializable 串行化事务操作 1.Read Uncommitted 读未提交 事务隔离级别设为Read Uncommitted时,能查询到其他事务已修改但尚未提交的数据,若后续其他事务发生回滚,则造成了脏读.是最低的事务隔离级别 2.Read Committed 读已提交 事务隔离级别设为R

【面试必备】快速理解数据库事务隔离级别

图片显示异常可前往https://juejin.im/post/5d5575dde51d4561a705badd查看 事务简介 相信用过MySQL的朋友都知道事务,我们也常常通过这个例子来讲解事务的作用:A向B转账,这里可以分为两步操作数据库,A账户余额减少,B账户余额增加.但是,如果在A账户余额减少的时候突然出现了数据库宕机了等情况,是不是会出现A的余额变少了,但是B的余额却没有增加的情况呢?答案是否定的.原因就是数据库支持事务(常用的关系型数据,如MySQL.Oracle等). 事务是应用程

[MySQL]对于事务并发处理带来的问题,脏读、不可重复读、幻读的理解与数据库事务隔离级别 - 分析脏读 & 不可重复读 & 幻读

刚开始写博客.. 写的太low. 1.数据库的两种读,每种读读的数据版本不一样,所以也称为MVCC,即多版本并发控制 a) 快照读 select * from where xxx  这种形式的都是快照读. b) 当前读 update , insert ,delete ,select xx from xx for update ,  in share mode 都是当前读 当前读会等待,不会返回数据的历史版本 2.mvcc 的实现原理 mvcc是基于read view.活跃事务列表 做的,以后的文

深入理解mysql锁与事务隔离级别

一.锁 1.锁的定义 锁即是一种用来协调多线程或进程并发使用同一共享资源的机制 2.锁的分类 从性能上分类:乐观锁和悲观锁 从数据库操作类型上分类:读锁和写锁 从操作粒度上分类:表锁和行锁 2.1 从性能上分类 2.1.1 乐观锁 乐观锁顾名思义就是操作的时候很乐观,认为操作不会产生并发问题(不会有其他线程对数据进行修改),因此不会上锁.但是会在更新时判断其他线程再这之前有没有对数据进行修改,一般会使用版本号机制或CAS算法实现. 2.1.1.1 版本号机制 实现方式: 取出记录时,获取当前ve