事务基础

来源:互联网 发布:mac画网络拓扑图 编辑:程序博客网 时间:2024/06/16 11:00

事务简介

事务就是以可控的方式对数据资源进行访问的一组操作。事务本身持有4个限定属性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),这也就是常说的事务的ACID属性。

1.原子性
原子性要求事务所包含的全部操作是一个不可分割的整体,这些操作要么全部提交成功,要么只要其中一个操作失败,就全部失败。
2.一致性
一致性要求事务所包含的操作不能违反数据资源的一致性检查,数据资源在事务执行之前处于某个数据一致性状态,那么事务执行之后也依然需要保持数据间的一致性状态。
3.隔离性
事务的隔离性主要规定了事务之间相互影响的程度。隔离性概念主要面向对数据资源的并发访问,并兼顾影响事务的一致性。当两个事务或者更多事务同时访问同一个数据资源的时候,不同的隔离级别决定了各个事务对该数据资源访问的不同行为。
隔离程度从弱到强分别为:
  • Read Uncommmitted。它是最低的隔离级别,一个事务可以读取另一个事务没有提交的更新结果。Read Uncommitted是以较低的隔离度来寻求较高的性能,其本身无法避免以下几个问题。

    • 脏读(Dirty Read)。如果一个事务对数据进行了更新,但事务还没有提交,另一个事务就可以“看到”该事务没有提交的更新结果。这样造成的问题就是,如果一个事务回滚,那么第二个事务在此之前“看到”的数据就是一笔脏数据。
    • 不可重复读(Non-Repeatable Read)。是指同一个事务在整个事务过程中对同一笔数据进行读取,每次读取结果都不同。如果事务1在事务2的更新操作之前读取一次数据,在事务2的更新操作之后再读取同一笔数据一次,两次结果不同。所以,Read Uncommitted也无法避免不可重复读取的问题。
    • 幻读(Phantom Read)。是指同样一个查询在整个事务过程中多次执行后,查询所得的结果集是不一样的。幻读针对的是多笔记录。在Read Uncommitted隔离级别下,不管事务2的插入操作是否提交,事务1在插入操作之前和之后执行相同的查询,取得的结果集是不同的。所以,Read Uncommitted同样无法避免幻读的问题。
  • Read Committed。通常,Read Committed是大部分数据库采用的默认隔离级别,它比Read Uncommitted隔离级别拥有更高级别的限定。在该隔离级别下,一个事务的更新操作结果只有在该事务提交之后,另一个事务才可能读取到同一笔数据更新后的结果。

  • Repeatable Read。可以保证在整个事务过程中,对同一笔数据的读取结果是相同的。不管其他事务是否同时在对同一笔数据进行更新,也不管其他事务对同一笔数据的更新提交与否。Repeatable Read隔离级别避免了脏读和不可重复读问题,但是无法避免幻读。

  • Serializable。它是最为严格的隔离级别。所有的事务操作都必须依次顺序执行,可以避免其他隔离级别遇到的所有问题,是最为安全的隔离级别,但同时也是性能最差的级别。通常情况下,我们会使用其他隔离级别加上相应的并发锁的机制来控制对数据的访问,这样既保证了系统性能不会损失太大,也能够在一定程度上保证数据的一致性。

    隔离级别与系统的并发性成反比,与数据一致性成正比。

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

事务的传播行为

  • PROPAGATION_REQUIRED。如果当前存在一个事务,则加入当前事务。如果不存在任何事务,则创建一个新的事务。通常作为默认的事务传播行为。
  • PROPAGATION_SUPPORTS。如果当前存在一个事务,则加入当前事务。如果不存在事务,则直接执行。通常比较适合查询方法。
  • PROPAGATION_MANDATORY。强制要求当前存在一个事务,如果不存在,则抛出异常。
  • PROPAGATION_REQUIRES_NEW。不管当前是否存在事务,都会创建新的事务。当某个业务对象所做的事情不想影响到外层事务是选择。
  • PROPAGATION_NOT_SUPPORTED。不支持当前事务,在没有事务的情况下执行。如果当前存在事务的话,当前事务原则上将被挂起。
  • PROPAGATION_NEVER。永远不需要当前存在事务,如果存在当前事务,则抛出异常。
  • PROPAGATION_NESETD。如果存在当前事务,则在当前事务的一个嵌套事务中执行。否则与PROPAGATION_REQUIRED行为相似,即创建新的事务。
0 0
原创粉丝点击