*博客搬家:初版发布于 2017/04/10 00:37    原博客地址:https://my.oschina.net/sunqinwen/blog/875833

数据库事务的隔离级别

讲事务的隔离级别之前,先来介绍一下数据库事务的几个特性:

(1)原子性

最基本的特性,意思是在一个事务内里所有关于数据库的操作,要么全部成功,要么全部失败;成功时意味着本次操作所有数据库相关的写操作全部持久化,无法更改,失败意味着本次操作相对于操作前对数据库没有任何影响和改变。

(2)一致性

指的是一次完整的事务必须将数据库的一个一致状态转变到另外一个一致状态。

一致性写:

例如:事务A要做的操作是将A、B、C三个记录修改为D、E、F,那么A、B、C----->D、E、F的过程就满足了事务一致性,但是如果出现类似:A、B、C---->D、E、C(A、B修改成功,但是C未修改)则认定违背了事务的一致性,简单理解一致性就是指事务的“初始状态”到“修改完成状态”与“目标状态一致”。

一致性读:

事务A在某一刻发起查询请求,那么查询结果是以那一刻为准,保证了数据在查询一刻的一致性。

(3)持久性

指一次事务的成功提交对数据库造成的修改是永久性的。

(4)隔离性

当多个用户并发访问数据库时,数据库为每一个用户开启的事务不可以被其他事务所影响,也就是说并发事务间要相互独立不受到干扰。关于隔离性分了集中隔离等级,本篇文章将详细介绍这几种隔离等级。

下面来讲下事务隔离级别:

(1)Read Uncommitted(读未提交)

这个隔离级别下未被提交的事务下所做的任何操作都可以被其他事务所读取到,这时候会造成数据的脏读、幻读、不可重复读问题。

(2)Read Committed(读已提交)

这个隔离级别下未被提交的操作不可以被其他事务所读取到,简单来讲就是单个事务里的内容在事务成功提交之前,是不会被其他事务所读取(发现)到的,但是这样同样会出现幻读、不可重复读现象。

举个栗子:事务T1要对C表做添加操作,同时事务T2里要读取C表,T2第一次读取C表时返回1条数据,这时T1执行完毕,那么T2如果再次取一次C表数据就会发现多出一条数据。

(3)Repeatable Read(可重读)

Mysql默认的隔离级别,这个隔离级别下同一事务读取到的数据一致(简单点说就是T1一旦开始,读取到数据如果中间被T2修改,那么T1再次读取该数据是和第一次读取时一样的),因此,在该隔离级别下,不会造成脏读、不可重复读,但依旧会造成幻读现象。

(4)Serializable(串行化)

最高隔离级别,会为每个事务排序(为每条数据都加上锁),使之执行串行化,不可能产生冲突,因此解决了脏读、幻读、不可重复读问题,但是会造成锁竞争甚至超时,一般不会采用这种极端的隔离机制。

事务并发过程中产生的问题介绍:

(1)脏读

一个事务读取到了另外一个事务中未提交的数据。

(2)不可重复读

一个事务读取到了另外一个事务中提交的修改掉的数据。

(3)幻读

一个事务读取到了另外一个事务中添加的数据。

Tip:不可重复读和幻读的区别在于着重点一个是update,一个是insert

总结四种隔离级别所造成和避免的问题,请先看以上内容后再看此表:

隔离级别 脏读 不可重复读 幻读
Read Uncommitted
Read Committed
Repeatable Read
Serializable

「DB」数据库事务的隔离级别的更多相关文章

  1. MySQL数据库事务各隔离级别加锁情况--read uncommitted篇(转)

    本文转自https://m.imooc.com/article/details?article_id=17291,感谢作者 1.目的 1.1 合适人群 1.数据库事务特征我只是背过,并没有很深刻的理解 ...

  2. Mysql数据库事务的隔离级别和锁的实现原理分析

    Mysql数据库事务的隔离级别和锁的实现原理分析 找到大神了:http://blog.csdn.net/tangkund3218/article/details/51753243 InnoDB使用MV ...

  3. Spring中事务的传播行为,7种事务的传播行为,数据库事务的隔离级别

    Propagation.REQUIRED 代表当前方法支持当前的事务,且与调用者处于同一事务上下文中,回滚统一回滚(如果当前方法是被其他方法调用的时候,且调用者本身即有事务),如果没有事务,则自己新建 ...

  4. MySQL数据库事务各隔离级别加锁情况--read committed && MVCC(转载)

    http://www.imooc.com/article/17290 http://www.51testing.com/html/38/n-3720638.html https://dev.mysql ...

  5. MySQL数据库事务各隔离级别加锁情况--read committed && MVCC(转)

    本文转自https://m.imooc.com/article/details?article_id=17290 感谢作者 上篇记录了我对MySQL 事务 隔离级别read uncommitted的理 ...

  6. 数据库事务ACID/隔离级别

    参考博客 1. 事务的定义 事务是用户定义的一个数据库操作序列.这些操作要么全执行,要么全不执行,是一个不可分割的工作单元.在关系型数据库中,事务可以是一条SQL语句,也可以是一组SQL语句或整个程序 ...

  7. 通过pymysql程序debug学习数据库事务、隔离级别

    问题 今天在使用pymysql连数据库的时候,出现了一个bug,查询数据库某个数据,但是在我在数据库中执行sql语句改变数据后,pymsql的查询依然没有发生改变. 代码如下: # 5.6.10 co ...

  8. Mysql数据库事务及隔离级别学习测试

    参考了这篇文章的一些内容: http://xm-king.iteye.com/blog/770721 记住以下这张表: 我在springdemo库里面建了一个表: CREATE TABLE `tx` ...

  9. MySQL数据库事务各隔离级别加锁情况--Repeatable Read && MVCC(转)

    本文转自https://m.imooc.com/article/details?article_id=17289 感谢作者 上节回顾 上两篇记录了我对MySQL 事务 隔离级别read uncommi ...

随机推荐

  1. Nginx 事件基本处理流程分析

    说明:本文章重点关注事件处理模型.有兴趣的同学可以去http://tengine.taobao.org/book/查找更多资料.Tengine应该是淘宝基于Nginx自己做的修改.这个地址的文档还在不 ...

  2. p1501 [国家集训队]Tree II

    传送门 分析 lct板子题 单独维护一下加和乘的情况即可 维护方法和维护翻转差不多 代码 #include<iostream> #include<cstdio> #includ ...

  3. code1047 邮票面值设计

    dfs+dp dfs枚举每种情况,每层递归确定第k个数i:i = a[k-1]+1 to a[k-1]*n+1 当枚举完一个序列时,使用check()测试它能达到的max 使用dp.设dp[i]为凑成 ...

  4. Linux Mint 17使用配置2

    tee命令--作用:读取标准输入的数据, 并将其内容输出成文件 who | tee who.out # 将who命令的输出写入同目录文件who.out中 who | grep loger9567 | ...

  5. python中return的用法

    def testReturn(x): if x > 10000: return print "test return!!" #这句话永远不会得到执行 elif x > ...

  6. 七)oracle 2 mysql

    /* Navicat MySQL Data Transfer Source Server : localhost Source Server Version : 50527 Source Host : ...

  7. 编写高质量代码改善C#程序的157个建议——建议144:一个方法只做一件事

    建议144:一个方法只做一件事 “单一职责原则”(SRP)要求每一个类型只负责一件事情.我们将此概念扩展到方法上,就变成了:一个方法只做一件事. 回顾上一建议的代码,LocalInit和RemoteI ...

  8. [Lua快速了解一下]Lua的函数

    -recurrsive function fib(n) end ) + fib(n - ) end -closure 示例一 function newCounter() return function ...

  9. thinkjs 框架图

  10. Android 使用pk10系统架设RecyclerView实现轮播图

    一.需求 ViewPager有个天生的缺陷是View无法重用,此外pk10系统架设详情咨询[企娥166848365]ViewPager的滑动过程会频繁requestLayout,尽管可以通过addVi ...