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

事务级别及相关内容

阅读更多
事务的四个属性:原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。

1.原子性(Atomic)
    最重要的原则,也是最容易理解的原则。被事务管理的所有方法,要么一起被提交,要么一起回滚。

2.一致性(Consistency)
    事务在系统完整性中实施一致性,如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于新有效状态。如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态。

3.隔离性(Isolation)
    在隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。重要的是,在隔离状态执行事务,系统的状态有可能是不一致的,在结束事务前,应确保系统处于一致状态。但是在每个单独的事务中,系统的状态可能会发生变化。如果事务不是在隔离状态运行,它就可能从系统中访问数据,而系统可能处于不一致状态。通过提供事务隔离,可以阻止这类事件的发生。

4.持久性(Durability)
    持久性意味着一旦事务执行成功,在系统中产生的所有变化将是永久的。应该存在一些检查点防止在系统失败时丢失信息。甚至硬件本身失败,系统的状态仍能通过在日志中记录事务完成的任务进行重建。

数据库锁概念:
    在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。
    从程序员的角度看,锁分为以下两种类型:
    1.乐观锁(Optimistic Lock)
    乐观锁假定在处理数据时,不需要在应用程序的代码中做任何事情就可以直接在记录上加锁、即完全依靠数据库来管理锁的工作。一般情况下,当执行事务处理时SQL Server会自动对事务处理范围内更新到的表做锁定。
    2.悲观锁(Pessimistic Lock)
    悲观锁对数据库系统的自动管理不感冒,需要程序员直接管理数据或对象上的加锁处理,并负责获取、共享和放弃正在使用的数据上的任何锁。

事务隔离级别
    一个事务必须与其它事务进行隔离的程度。较低的隔离级别可以增加并发,但代价是降低数据的正确性。相反,较高的隔离级别可以确保数据的正确性,但可能对并发产生负面影响。

数据库并发操作存在的异常情况:
1. 更新丢失(Lost update):两个事务都同时更新一行数据但是第二个事务却中途失败退出导致对数据两个修改都失效了这是系统没有执行任何锁操作因此并发事务并没有被隔离开来

2. 脏读取(Dirty Reads):一个事务开始读取了某行数据但是另外一个事务已经更新了此数据但没有能够及时提交。这是相当危险很可能所有操作都被回滚

3. 不可重复读取(Non-repeatable Reads):一个事务对同一行数据重复读取两次但是却得到了不同结果。例如在两次读取中途有另外一个事务对该行数据进行了修改并提交

4. 两次更新问题(Second lost updates problem):无法重复读取特例,有两个并发事务同时读取同一行数据然后其中一个对它进行修改提交而另一个也进行了修改提交这就会造成第一次写操作失效

5. 幻读(Phantom Reads):也称为幻像(幻影)。事务在操作过程中进行两次查询,第二次查询结果包含了第一次查询中未出现的数据(这里并不要求两次查询SQL语句相同)这是因为在两次查询过程中有另外一个事务插入数据造成的

为了避免上面出现几种情况在标准SQL规范中定义了4个事务隔离级别,不同隔离级别对事务处理不同 。

1.未授权读取(Read Uncommitted):也称未提交读。允许脏读取但不允许更新丢失,如果一个事务已经开始写数据则另外一个数据则不允许同时进行写操作但允许其他事务读此行数据。该隔离级别可以通过“排他写锁”实现。事务隔离的最低级别,仅可保证不读取物理损坏的数据。与READ COMMITTED 隔离级相反,它允许读取已经被其它用户修改但尚未提交确定的数据。

2. 授权读取(Read Committed):也称提交读。允许不可重复读取但不允许脏读取。这可以通过“瞬间共享读锁”和“排他写锁”实现,读取数据的事务允许其他事务继续访问该行数据,但是未提交写事务将会禁止其他事务访问该行。SQL Server 默认的级别。在此隔离级下,SELECT 命令不会返回尚未提交(Committed) 的数据,也不能返回脏数据。

3. 可重复读取(Repeatable Read):禁止不可重复读取和脏读取。但是有时可能出现幻影数据,这可以通过“共享读锁”和“排他写锁”实现,读取数据事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。在此隔离级下,用SELECT 命令读取的数据在整个命令执行过程中不会被更改。此选项会影响系统的效能,非必要情况最好不用此隔离级。

4. 串行(Serializable):也称可串行读。提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过 “行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作事务访问到。事务隔离的最高级别,事务之间完全隔离。如果事务在可串行读隔离级别上运行,则可以保证任何并发重叠事务均是串行的。


隔离级别 更新丢失 脏读取 重复读取 幻读
未授权读取 N Y Y Y
授权读取 N N Y Y
可重复读取 N N N Y
串行 N N N N


Oracle 支持的 2 种事务隔离级别 Read committed 和 Serializable

根據官方資料,它們的區別如下:

动作                      Read Committed        Serializable
Dirty write           Not possible          Not possible
Dirty read            Not possible          Not possible
Nonrepeatable read    Possible              Not possible
Phantoms              Possible              Not possible

Read committed 是默认的隔离级别。
对于Read committed ,事务中的查询只能看到在此查询之前( 而非事务开始之前 )提交的数据。 由于 oracle 不会因为查询数据而阻止另外一个事务修改数据,因此数据可以在一个事务中的 2 次查询中,查到不同的结果。因此 可能出现 nonrepeatable read and phantoms 的情况

对于serializable transactions ,当2次执行同一条查询语句的时候(就是两次执行查询,就是说执行完第一个 .executeQuery ,然后执行第二个 .executeQuery ),如果在第一个 .executeQuery 开始执行而另外一个事务已经开始修改数据,并且已经提交,那么两次读取的数据是另外一个事务修改前的数据。如果在第一个 .executeQuery 之前,另外一个事务修改了数据,那么两次读取的数据是另外一个事务修改后的数据。

这恰恰反映了, repeatable read ,两次结果一致

这与 Read committed 完全不同, 要是 Read committed ,第一个 .executeQuery 未执行完第二事务,而在第二个 .executeQuery 前第二个事务执行完毕,那么第一个 .executeQuery 得到的是初始数据,而第二个 .executeQuery 得到的是修改后的数据

恰恰说明了 nonrepeatable read ,两次结果不一致的情况
分享到:
评论

相关推荐

    Spring声明式数据库事务的使用-隔离级别

    上面我们只是简单的使用事务,这里将讨论Spring事务机制中最重要的两个配置项,即隔离级别与传播行为。...应该说,隔离级别是数据库的概念,有些难度,所以在使用它之前应该先了解数据库的相关知识 1

    msyql锁、事务隔离级别各种场景验证测试.rar

    这意味着所有相关的数据规 则都必须应用于事务的修改,以保持数据的完整性。(可以理解为抽象出来的内容同现实内容的相互映射关系要一致)。 C是目的,其他三个AID属性是手段。 隔离性(Isolation) :数据库系统提供...

    mysql中的事务、锁讲解和操作

    关于MySQL的事务,我们会深入探讨事务的定义、ACID属性、事务的相关隔离级别以及事务的执行流程等重要内容。同时,我们还会介绍到MySQL中的事务日志以及如何进行事务的管理和调优。而对于MySQL中的锁,我们将会介绍...

    【面试必备】Spring事务源码解析.txt

    本资源讲解的是Spring事务的相关技术,需要可自行下载。 课程内容: 1.实战了解学习源码应有的姿势? 2.埋坑,从深坑中玩转事务; 3.迷一般的事务?我数据验证为啥失效? 4.透过源码学习事务隔离级别; 5.源码解读,...

    MySQL中的长事务示例详解

    言归正传,本篇文章主要介绍MySQL长事务相关内容,比如说我们开启的一个事务,一直没提交或回滚会怎样呢,出现事务等待情况应该如何处理,本篇文章将给你答案。 注意:本篇文章并不聚焦于谈论事务隔离级别以及相关...

    深入了解mysql长事务

    本篇文章主要介绍MySQL长事务相关内容,比如说我们开启的一个事务,一直没提交或回滚会怎样呢,出现事务等待情况应该如何处理,本篇文章将给你答案。 注意:本篇文章并不聚焦于谈论事务隔离级别以及相关特性。而是...

    Spring事务传播属性和隔离级别详细介绍

    主要介绍了Spring事务传播属性和隔离级别详细介绍,同时涉及传播行为介绍,超时设置等相关内容,需要的朋友可以参考下。

    事务讲解-LingRan.pptx

    主要内容涉及java事务的基础,事务的四大特性,数据库中的事务,并发访问出现的问题和隔离级别设置,JDBC中的实现以及事务相关面试问题的整理汇总。

    MySQL事务控制和锁机制

    本文基于MySQL5.7为基础,讨论与数据库事务和锁的相关内容。 锁机制 根据加锁的范围,MySQL里面的锁可以分成全局锁、表级锁和行锁三类。 全局锁 全局锁能够对整个库实例进行加锁。 加锁的语法: FLUSH TABLES WITH ...

    JAVA面试常见问题整理

    JAVA面试常见问题整理 本文主要概述了Java面试中常见...同时,还涉及了事务处理的并发问题、Spring事务的实现方式和隔离级别等相关知识。 总之,本文为读者提供了一个关于Java面试常见问题及内容的概述,帮助读者更好

    最新MySQL高频面试题.rar

    跟隔离级别相关,如read committed,一个事务只能读到已经提交的修改。 持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。...

    数据库系统概论CH10(部分)习题解答.doc

    数据库的事务管理策略(不仅有数据库恢复策略,还有并发控制策 略)和DBMS缓冲区管理策略、事务一致性级别密切相关,读者要在学习完全书后再来重新 考虑这些问题,提升对这些技术的理解和掌握。 读者要掌握数据库故障...

    2023最新MySQL高频面试题汇总

    跟隔离级别相关,如read committed,一个事务只能读到已经提交的修改。 持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。 ...

    如何写好代码的一些建议(Java版)

    文章详细解释了命名的含义和规则、日志打印的不同级别和要求、线程池和线程安全的相关概念、数组和链表的特点和使用场景、异常类型和使用误区、事务的传播方式和应用,以及设计原则中的单一职责和开闭原则等。

    数据库(主要是MySQL)相关面试知识点总结

    自己秋招总结的内容~~~ 数据库(主要是MySQL)相关面试...分布式和集群、主从服务器、数据库的数据结构、索引以及索引创建、数据库设计四大范式、反范式化、事务基本要素、隔离级别及实现、事务并发问题、MVCC、SQL注入

    数据库原理测试题.docx

    事务处理和并发控制: 测试对象可能会面临有关事务处理和并发控制的问题,包括事务的特性、ACID 属性,以及并发控制的方法和技术。 索引和优化: 考查测试对象是否理解数据库索引的作用,以及如何使用索引优化查

    特别参考安全内容自动化协议 (SCAP) 的信息保证 — 概述-研究论文

    该术语拥有最高级别的安全相关事务。 通常,计算机安全被视为安全的一个分支和领域,但现在除此之外,信息安全、IT 安全和信息保障也被认为是重要的。 其中,与安全相关的领域信息保障被视为更广泛和跨学科的。 ...

    Java语言基础下载

    事务的级别控制 343 使用存储过程 345 操作元数据 347 ResultSetMetaData(结果集元数据) 349 可滚动的和可更新的结果集 350 批处理更新 354 二进制大对象BLOB 357 RowSet 新特性 359 JdbcRowSet 360 ...

    精通SQL 结构化查询语言详解

    18.1.3 SQL中与事务有关的语句  18.2 事务控制的具体实现 18.2.1 开始事务  18.2.2 SET CONSTRAINTS语句设置约束的延期执行  18.2.3 终止事务  18.3 并发控制 18.3.1 并发操作的问题 18.3.2 事务隔离...

Global site tag (gtag.js) - Google Analytics