*博客搬家:初版发布于 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. cakephp跳转到指定的错误页面

    第一步:修改core.php 第二步:创建AppExceptionRender.php文件 参考:https://blog.jordanhopfner.com/2012/09/11/custom-40 ...

  2. 关于更新vs2017后发布的问题 命令“bower install”已退出,代码为 9009

    更新vs2017 尝试发布 出现  命令“bower install”已退出,代码为 9009 然后我点工具测试了一下nodejs 出现下图弹窗  百度了一下 没找到对策,有没有大侠知道怎么解决 解决 ...

  3. response乱码和request乱码

    response乱码 一.浏览器乱码 原因是:浏览器显示编码和文件的数据编码不一致 浏览器显示编码  response.setCharacterEncoding("utf-8"); ...

  4. 《Maven实战》

    原创作者: 许晓斌   阅读:61148次   评论:19条   更新时间:2011-06-23     你是否早已厌倦了日复一日的手工构建工作?你是否对各个项目风格迥异的构建系统感到恐惧?Maven ...

  5. [GO]errorr接口的使用

    package main import ( "fmt" "errors" ) func main() { erro1 := fmt.Errorf("% ...

  6. 特征工程 vs. 特征提取

    “特征工程”这个华丽的术语,它以尽可能容易地使模型达到良好性能的方式,来确保你的预测因子被编码到模型中.例如,如果你有一个日期字段作为一个预测因子,并且它在周末与平日的响应上有着很大的不同,那么以这种 ...

  7. Xshell 连接Linux虚拟机失败解决办法

    当我们在VMWare上安装好Ubuntu虚拟机后,有时候会需要使用多个terminal窗口,但是在虚拟机中多个窗口互相切换查看不方便,这时候用物理机的xshell工具连接到虚拟机中去就显得很方便.直接 ...

  8. Linux 判断进程是否已经运行的程序

    bool ServerProcess::isAlreadyRunning() { #ifndef __linux__ WarningLog(<<"can't check if p ...

  9. solr&lucene3.6.0源码解析(二)

    上文描述了solr3.6.0怎么采用maven管理的方式在eclipse中搭建开发环境,在solr中,为了提高搜索性能,采用了缓存机制,这里描述的是LRU缓存,这里用到了 LinkedHashMap类 ...

  10. 微信openid

    微信openid由用户id和公众号id加密而来,同一用户相对同一公众账号的openid是不变的.