`
pavel
  • 浏览: 914741 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

标准SQL规范中定义的四个事务隔离级别

阅读更多

 在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同:

  ◆未授权读取(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。

  ◆授权读取(Read Committed):允许不可重复读取,但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。

  ◆可重复读取(Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻影数据。这可以通过“共享读锁”和“排他写锁”实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。

  ◆序列化(Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。

  隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为 Read Committed,它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。

  通过前面的介绍已经知道,通过选用不同的隔离等级就可以在不同程度上避免前面所提及的在事务处理中所面临的各种问题。所以,数据库隔离级别的选取就显得尤为重要,在选取数据库的隔离级别时,应该注意以下几个处理的原则:

  首先,必须排除“未授权读取”,因为在多个事务之间使用它将会是非常危险的。事务的回滚操作或失败将会影响到其他并发事务。第一个事务的回滚将会完全将其他事务的操作清除,甚至使数据库处在一个不一致的状态。很可能一个已回滚为结束的事务对数据的修改最后却修改提交了,因为“未授权读取”允许其他事务读取数据,最后整个错误状态在其他事务之间传播开来。

  其次,绝大部分应用都无须使用“序列化”隔离(一般来说,读取幻影数据并不是一个问题),此隔离级别也难以测量。目前使用序列化隔离的应用中,一般都使用悲观锁,这样强行使所有事务都序列化执行。

  剩下的也就是在“授权读取”和“可重复读取”之间选择了。我们先考虑可重复读取。如果所有的数据访问都是在统一的原子数据库事务中,此隔离级别 将消除一个事务在另外一个并发事务过程中覆盖数据的可能性(第二个事务更新丢失问题)。这是一个非常重要的问题,但是使用可重复读取并不是解决问题的唯一途径。

  假设使用了“版本数据”,Hibernate会自动使用版本数据。Hibernate的一级Session缓存和版本数据已经为你提供了“可重复读取隔离”绝大部分的特性。特别是,版本数据可以防止二次更新丢失的问题,一级Session缓存可以保证持久载入数据的状态与其他事务对数据的修改隔离开来,因此如果使用对所有的数据库事务采用授权读取隔离和版本数据是行得通的。

  “可重复读取”为数据库查询提供了更好的效率(仅对那些长时间的数据库事务),但是由于幻影读取依然存在,因此没必要使用它(对于Web应用来说,一般也很少在一个数据库事务中对同一个表查询两次)。

  也可以同时考虑选择使用Hibernate的二级缓存,它可以如同底层的数据库事务一样提供相同的事务隔离,但是它可能弱化隔离。假如在二级缓存大量使用缓存并发策略,它并不提供重复读取语义(例如,后面章节中将要讨论的读写,特别是非严格读写),很容易可以选择默认的隔离级别:因为无论如何都无法实现“可重复读取”,因此就更没有必要拖慢数据库了。另一方面,可能对关键类不采用二级缓存,或者采用一个完全的事务缓存,提供“可重复读取隔离”。那么在业务中需要使用到“可重复读取”吗?如果你喜欢,当然可以那样做,但更多的时候并没有必要花费这个代价。

 

分享到:
评论

相关推荐

    MySQL数据库:事务隔离级别.pptx

    理解 —— 事务隔离的四种级别; 掌握 —— 事务隔离级别的设置; 事务隔离级别 事务隔离:每一个事务都有一个所谓的隔离级,它定义了用户彼此之间隔离和交互的程度。隔离性强制对事务进行某种程度的隔离,保证应用...

    简述MySql四种事务隔离级别

    在SQL标准中定义了四种隔离级别, 每一个事务中所做的修改,哪些在事务内和事务间是可见的,哪些是不可见的。较低级别的隔离通常可以执行更高的并发,系统的开销也更低。 下面简单地介绍一下四种隔离级别。 1.READ ...

    一文彻底读懂PostgreSQL事务隔离级别

    SQL标准定义了四种隔离级别。隔离级别从低到高分别是:Read uncommitted 、Read committed 、Repeatable read 、Serializable。在各个隔离级别上被禁止出现的现象是: 脏读:一个事务读取了另一个并行未提交事务写入...

    数据库事务隔离级别

     在SQL标准中定义了事务的四种隔离级别:  1,read uncommitted 未提交读  事务中的改动。即使没有提交,对其它事务也都是可见的。即事务能够读取未提交的数据。即会产生脏读。  2,read committed 提交读...

    大厂喜欢问的面试题50道

    4、如何区分FLOAT和DOUBLE?以下是FLOAT和DOUBLE的区别:  浮点数以8位精度存储在FLOAT中,并且有四个字节。   浮点数存储在DOUBLE中,...SQL标准定义的四个隔离级别为:  read uncommited :读到未提交数据 

    达梦数据库_SQL语言手册

    性,它保证同一事务内的可重复读,为此提供用户多种手动上锁语句,和设置事务隔离级别 第1章结构化查询语言简介 语句 所支持的数据类型 数据类型是可表示值的集。值的逻辑表示是字值。值的物理表示依赖于实现。...

    SQL优化面试专题.pdf

    请简洁描述 Mysql 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?在 Mysql 中 ENUM 的用法是什么?如何定义 REGEXP?CHAR 和 VARCHAR 的区别?列的字符串类型可以是什么?如何获取当前的 Mysql 版本?...

    程序员的SQL金典.rar

     10.3.3 事务的隔离级别  10.3.4 事务的使用  10.4 自动增长字段  10.4.1 MySQL中的自动增长字段  10.4.2 MS SQL Server中的自动增长字段  10.4.3 Oracle中的自动增长字段  10.4.4 DB2中的自动增长字段  ...

    21天学会SQL

    5.4.5 事务隔离级别的设置 104 5.5 事务的阻塞 105 5.6 死锁 107 5.6.1 死锁的产生 107 5.6.2 处理死锁 108 5.6.3 预防死锁 109 5.7 索引 109 5.7.1 认识索引 110 5.7.2 索引的创建 111 5.7.3 索引的管理 113 5.8 小...

    精通sql结构化查询语句

    讲解SQL语言的应用,提供了近500个曲型应用,读者可以随查随用,深入讲解SQL语言的各种查询语句,详细介绍数据库设计及管理,详细讲解存储过程、解发器和游标等知识,讲解了SQL语言在高级语言中的具体应用。...

    程序员的SQL金典4-8

     10.3.3 事务的隔离级别  10.3.4 事务的使用  10.4 自动增长字段  10.4.1 MySQL中的自动增长字段  10.4.2 MS SQL Server中的自动增长字段  10.4.3 Oracle中的自动增长字段  10.4.4 DB2中的自动增长字段  ...

    Oracle数据库、SQL

    17.4事务的隔离级别 35 17.5数据库开发的关键挑战 35 17.6锁的概念 36 17.7 Oracle的锁机制 36 17.8事务不提交的后果 36 17.9回滚事务rollback 36 17.10保留点savepoint 36 十八、 数据库对象:视图view 37 18.1带子...

    SQL Server 2008数据库设计与实现

     10.5.2 隔离级别  10.6 完整性与并发性编程  10.6.1 悲观锁定  10.6.2 实现单线程代码块  10.6.3 乐观锁定  10.6.4 基于行的锁定  10.6.5 逻辑工作单元  10.7 最佳实践  10.8 总结 第11章 数据...

    程序员的SQL金典6-8

     10.3.3 事务的隔离级别  10.3.4 事务的使用  10.4 自动增长字段  10.4.1 MySQL中的自动增长字段  10.4.2 MS SQL Server中的自动增长字段  10.4.3 Oracle中的自动增长字段  10.4.4 DB2中的自动增长字段  ...

    程序员的SQL金典7-8

     10.3.3 事务的隔离级别  10.3.4 事务的使用  10.4 自动增长字段  10.4.1 MySQL中的自动增长字段  10.4.2 MS SQL Server中的自动增长字段  10.4.3 Oracle中的自动增长字段  10.4.4 DB2中的自动增长字段  ...

    程序员的SQL金典3-8

     10.3.3 事务的隔离级别  10.3.4 事务的使用  10.4 自动增长字段  10.4.1 MySQL中的自动增长字段  10.4.2 MS SQL Server中的自动增长字段  10.4.3 Oracle中的自动增长字段  10.4.4 DB2中的自动增长字段  ...

    MySQL事务

    处在事务中的,一个事务的结束,代表着下一个事务的开启 执行commit或者rollback指令时,会结束当前事务 [已经提交的事务将不能够被回滚] 作用:用来保证数据的平稳性和可预测性. 事务的四大特性(ACID): atomic,原子性,...

    细心整理的50道mysql常见高频面试题-需要的小伙伴可以自测学习一下

    题目预览: ...8、请简洁描述Mysql中InnoDB支持的四种事务隔离级别名称,以及逐级之间的区别? 9、在Mysql中ENUM的用法是什么? 10、如何定义REGEXP? 以上只罗列10道题,剩余全部题和答案都在压缩包内

    MySQL高级(六):事务的四大特性和使用

    在日常生活中,有时我们需要进行银行转账,这个银行转账操作背后就是需要执行多个SQL语句,假如这些SQL执行到一半突然停电了,那么就会导致这个功能只完成了一半,这种情况是不允许出现,要想解决这个问题就需要通过...

    MySQL的事务与锁解析

    本文8500多字,5个大目录一、什么是事务1. 使用场景2. 事务定义3. 哪些存储引擎支持事务4.事务的四大特性5.提交和回滚事务6....项目里面,比如有涉及到转账、操作订单之类的,我们需要让这些操作在一个事务里面

Global site tag (gtag.js) - Google Analytics