数据库事务隔离级别

数据库提供了四种事务隔离级别, 不同的隔离级别采用不同的锁类开来实现.

在四种隔离级别中,

Serializable的级别最高,

Read Uncommited级别最低.

大多数数据库的默认隔离级别为: Read Commited,如Sql Server , Oracle.

少数数据库默认的隔离级别为Repeatable Read, 如MySQL InnoDB存储引擎

即使是最低的级别,也不会出现 第一类 丢失 更新问题 .

1. 脏读(事务修改数据没提交,另一个事物提前读取):脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据。

2. 不可重复读(在一个事务内,多次读时,另一个事务做了修改,到止读取不一致) :是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。

3. 幻读 (两个事物修改): 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。例如,一个编辑人员更改作者提交的文档,但当生产部门将其更改内容合并到该文档的主复本时,发现作者已将未编辑的新材料添加到该文档中。如果在编辑人员和生产部门完成对原始文档的处理之前,任何人都不能将新材料添加到文档中,则可以避免该问题。

4.第一类更新丢失(事务回滚 丢失):

当2个事务更新相同的数据源,如果第一个事务被提交,而另外一个事务却被撤销,那么会连同第一个事务所做的跟新也被撤销。也就是说第一个事务做的跟新丢失了。

5.第二类更新丢失(更新覆盖 丢失):

第二类更新丢失实在实际应用中经常遇到的并发问题,他和不可重复读本质上是同一类并发问题,通常他被看做不可重复读的特例:当2个或这个多个事务查询同样的记录然后各自基于最初的查询结果更新该行时,会造成第二类丢失更新。因为每个事务都不知道不知道其他事务的存在,最后一个事务对记录做的修改将覆盖其他事务对该记录做的已提交的跟新...

一、为了处理这些问题,SQL标准定义了以下4种事务隔离级别:

READ UNCOMMITTED(未提交读) 幻想读、不可重复读和脏读都允许。一个会话可以读取其他事务未提交的更新结果,如果这个事务最后以回滚结束,这时的读取结果就可能是不正确的,所以多数的数据库都不会运用这种隔离级别。

READ COMMITTED(已提交读) 允许幻想读、不可重复读,不允许脏读。一个会话只能读取其他事务已提交的更新结果,否则,发生等待,但是其他会话可以修改这个事务中被读取的记录,而不必等待事务结束,显然,在这种隔离级别下,一个事务中的两个相同的读取操作,其结果可能不同。

REPEATABLE READ(可重复读) 允许幻想读,不允许不可重复读和脏读。在一个事务中,如果在两次相同条件的读取操作之间没有添加记录的操作,也没有其他更新操作导致在这个查询条件下记录数增多,则两次读取结果相同。换句话说,就是在一个事务中第一次读取的记录保证不会在这个事务期间发生改动。SQL Server是通过在整个事务期间给读取的记录加锁实现这种隔离级别的,这样,在这个事务结束前,其他会话不能修改事务中读取的记录,而只能等待事务结束,但是SQL Server不会阻碍其他会话向表中添加记录,也不阻碍其他会话修改其他记录。

SERIALIZABLE(可序列化度) 幻想读、不可重复读和脏读都不允许。在一个事务中,读取操作的结果是在这个事务开始之前其他事务就已经提交的记录,SQL Server通过在整个事务期间给表加锁实现这种隔离级别。在这种隔离级别下,对这个表的所有DML操作都是不允许的,即要等待事务结束,这样就保证了在一个事务中的两次读取操作的结果肯定是相同的。SQL标准所定义的默认事务隔离级别是SERIALIZABLE。

二、Oracle中的隔离级别及实现机制:

Oracle数据库支持READ COMMITTED 和 SERIALIZABLE这两种事务隔离级别。所以Oracle不支持脏读,即Oracle中不允许一个会话读取其他事务未提交的数据修改结果,从而防止了由于事务回滚发生的读取不正确。

Oracle回滚段(快照),在修改数据记录时,会把这些记录被修改之前的结果存入回滚段或撤销段中。Oracle读取操作不会阻碍更新操作,更新操作也不会阻碍读取操作

Oracle缺省的配置是Read Committed隔离级别(也称为语句级别的隔离),在这种隔离级别下,如果一个事务正在对某个表执行 DML操作,而这时另外一个会话对这个表的记录执行读取操作,则Oracle会去读取回滚段或撤销段中存放的更新之前的记录,而不会象SQL Server一样等待更新事务的结束。

Oracle的Serializable隔离级别(也称为事务级别的隔离),事务中的读取操作只能读取这个事务开始之前已经提交的数据结果。如果在读取时,其他事务正在对记录执行修改,则Oracle就会在回滚段或撤销段中去寻找对应的原来未经修改的记录(而且是在读取操作所在的事务开始之前存放于回滚段或撤销段的记录),这时读取操作也不会因为相应记录被更新而等待。

补充 : 基于元数据的 Spring 声明性事务 :

Isolation[ˌaɪsəˈleɪʃən] 隔离: 属性一共支持五种事务设置,具体介绍如下:

l , DEFAULT 使用数据库设置的隔离级别 ( 默认 ) ,由 DBA 默认的设置来决定隔离级别 .

2, READ_UNCOMMITTED 会出现脏读、不可重复读、幻读 ( 隔离级别最低,并发性能高 )

3.,READ_COMMITTED  会出现不可重复读、幻读问题(锁定正在读取的行)

4,REPEATABLE_READ 会出幻读(锁定所读取的所有行)

5,SERIALIZABLE 保证所有的情况不会发生(锁表)

不可重复读的重点是修改 :

同样的条件 ,   你读取过的数据 ,   再次读取出来发现值不一样了

幻读的重点在于新增或者删除

同样的条件 ,   第 1 次和第 2 次读出来的记录数不一样

转载于:https://www.cnblogs.com/xuxiuxiu/p/7081078.html

数据库事务隔离级别+Spring 声明性事务隔离级别相关推荐

  1. mysql事务管理及spring声明式事务中主动异常抛出使数据库回滚

    mysql事务管理及spring声明式事务中主动异常抛出使数据库回滚 参考文章: (1)mysql事务管理及spring声明式事务中主动异常抛出使数据库回滚 (2)https://www.cnblog ...

  2. Spring学习8-Spring事务管理(AOP/声明式式事务管理)

    一.基础知识普及 声明式事务的事务属性: 一:传播行为 二:隔离级别 三:只读提示 四:事务超时间隔 五:异常:指定除去RuntimeException其他回滚异常.  传播行为: 所谓事务的传播行为 ...

  3. service和controller都加了事务_「Spring声明式事务」在service内部之间调用竟然失效啦?...

    在开发过程中你是否遇到过这样的问题,当在Controller中调用Service中A()方法,A方法内部又调用Service中B()方法,由于A方法中只有查询操作所以没有加事务控制,B方法中含有多次修 ...

  4. Spring五个事务隔离级别和七个事务传播行为

    Spring五个事务隔离级别和七个事务传播行为 1. 脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数 ...

  5. [译] Spring 的分布式事务实现-使用和不使用XA — 第三部分

    原文地址:Distributed transactions in Spring, with and without XA - Part III 原文作者:David Syer 译文出自:掘金翻译计划 ...

  6. 深入理解Spring事务原理【为何有了数据库事务还要使用Spring事务】

    一.事务的基本原理 Spring事务 的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的.对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行:     ...

  7. Spring 详解(五):Spring声明式事务

    事务管理是企业级应用程序开发中必备技术,用来确保数据的完整性和一致性.本文主要讲解事务涉及到一些概念以及spring中事务的使用. 1. 事务 数据库事务(Database Transaction) ...

  8. 在Spring中了解事务注释

    1.简介 Spring为程序性和声明性事务提供支持. 1.1程序化交易 对于程序性事务,需要显式编写事务管理代码,以便在一切成功后提交,并在出现问题时回滚. 在这种情况下,事务管理代码与业务逻辑紧密绑 ...

  9. spring 事务_极限 Spring (4) Spring 事务

    Spring 并不直接支持事务,只有当数据库支持事务时,Spring 才支持事务,Spring 只不过简化了开发人员实现事务的步骤. Spring 提供了两种方式实现事务, 声明式和编程式. 如何选择 ...

最新文章

  1. Squid代理服务器安装设置
  2. 必考题:子类继承父类,初始化以及方法调用顺序
  3. java 创建日程到期提醒_苹果“快捷指令”日程播报完美版
  4. [CodeForces 300D Painting Square]DP
  5. 如何求解单边z变换_的单边Z变换。.ppt
  6. 正则表达式格式化日期
  7. 百度新闻 谷歌新闻_每日新闻摘要:到目前为止,Google I / O提供的最佳信息
  8. linux系统调用是通过软中断实现的吗
  9. 【博客项目】—数据分页(十)
  10. IE 浏览器 js new Date NAN
  11. Codeforces Round #521 (Div. 3): F. Pictures with Kittens(DP+单调队列)
  12. Sublime Text3的插件管理Package Control安装
  13. 美了美了!22款精美的 iOS 应用程序图标模板
  14. SAP WM + PDA项目 来料入库流程
  15. HDU 6080 2017百度之星程序设计大赛 - 资格赛
  16. java 求黄金分割点
  17. Linux开发板网络直连电脑的设置方法
  18. 从电路交换到分组交换——TDM、ATM
  19. 美国国债主成分分析Matlab
  20. Windows中编译wireshark3.0以上版本指南

热门文章

  1. JavaScript(六)—— DOM 事件高级
  2. 7-172 一元多项式求导 (20 分)
  3. 2019递归实现字符串的逆序存储(C++)
  4. 两种方法:实现输入一行字符,统计数字字符、英文字母和其他字符的个数(C语言)
  5. 鸿蒙系统9月11号上市吗,9月11日鸿蒙系统2.0要搭载华为全家桶来了,你期待吗?...
  6. 计算机应用基础发帖本科,《计算机应用基础》(本)教学大纲.doc
  7. es6新特性之Map
  8. 【CF321E】+【bzoj5311】贞鱼
  9. RDC出库财务计费逻辑
  10. VS2015新建项目无法选择framework 4.6.2