Spring事务(一) Markdown 版

事务

事务的特性(ACID)

  1. 原子性(Atomicity)html

    原子性要求事务所包含的所有操做是一个不可分割的总体,这些操做要么所有提交成功,要么只要其中一个操做失败,就所有“成仁”数据库

  2. 一致性(Consistency)安全

    一致性要求事务所包含的操做不能违反数据资源的一致性检查,数据资源在事务执行以前处于一个数据的一致性状态,那么,事务执行以后也须要依然保持数据间的一致性状态并发

  3. 隔离性(ISOlation)性能

    事务的隔离性主要规定了各个事务之间相互影响的程度。隔离性概念主要面向对数据资源的并发访问(Concurrency),并兼顾影响事务的一致性。当两个事务或者更多事务同时访问同一数据资源的时候,不一样的隔离级别决定了各个事务对该数据资源访问的不一样行为。htm

    咱们能够为事务指定四种类型的隔离级别,隔离程度按照从弱到强分别为“Read Uncommitted”,“Read Committed”,“Repeatable Read”和“Serializable”:
    • Read Uncommitted. 最低的隔离级别,Read Uncommitted最直接的效果就是一个事务能够读取另外一个事务并未提交的更新结果。
      Read Uncommitted是以较低的隔离度来寻求较高的性能,其自己没法避免如下几个问题:
    1. 脏读(Dirty Read). 若是一个事务中对数据进行了更新,但事务尚未提交,另外一个事务能够“看到”该事务没有提交的更新结果,这样形成的问题就是,若是第一个事务回滚,那么,第二个事务在此以前所“看到”的数据就是一笔脏数据。
    2. 不可重复读取(Non-Repeatable Read). 不可重复读取是指同一个事务在整个事务过程当中对同一笔数据进行读取,每次读取结果都不一样。若是事务1在事务2的更新操做以前读取一次数据,在事务2的更新操做以后再读取同一笔数据一次,两次结果是不一样的,因此,Read Uncommitted也没法避免不可重复读取的问题。
    3. 幻读(Phantom Read)[3]. 幻读是指一样一笔查询在整个事务过程当中屡次执行后,查询所得的结果集是不同的。幻读针对的是多笔记录。在Read Uncommitted隔离级别下, 无论事务2的插入操做是否提交,事务1在插入操做以前和以后执行相同的查询,取得的结果集是不一样的,因此,Read Uncommitted一样没法避免幻读的问题。
    • Read Committed(一般是大部分数据库采用的默认隔离级别),它在Read Uncommitted 隔离级别的基础上所作的限定更进一步,在该隔离级别下,一个事务的更新操做结果只有在该事务提交以后,另外一个事务才可能读取到同一笔数据更新后的结果。因此Read Committed能够避免Read UnCommitted隔离级别下存在的脏数据问题,但没法避免不可重复读取和幻读的问题。
    • Repeatable Read Repeatable Read隔离级别能够保证在整个事务的过程当中,对同一笔数据的读取结果是相同的,无论其余事务是否同时在对同一笔数据进行更新,也无论其余事务对同一笔数据的更新提交与否。 Repeatable Read隔离级别避免了脏读和不可重复读取的问题,但没法避免幻读。
    • Serializable 最为严格的隔离级别,全部的事务操做都必须依次顺序执行,能够避免其余隔离级别遇到的全部问题,是最为安全的隔离级别, 但同时也是性能最差的隔离级别,由于全部的事务在该隔离级别下都须要依次顺序执行,因此,并发度降低,吞吐量上不去,性能天然就下来了。 由于该隔离级别极大的影响系统性能,因此,不多场景会使用它。一般状况下,咱们会使用其余隔离级别加上相应的并发锁的机制来控制对数据的访问,这样既保证了系统性能不会损失太大,也可以必定程度上保证数据的一致性

==在具体的实践中,咱们须要根据系统的具体状况来调整隔离度以保证系统性能与数据一致性之间的一个良好的平衡,但总的来讲,保证数据的一致性的考虑应该优先于对系统性能的考虑。==blog

  1. 持久性(Durability)事务

    事务的持久性是指一旦整个事务操做成功提交完成,对数据所作的变动将被记载并不可逆转
    Spring事务ci

相关文章
相关标签/搜索