经常听到别人说事务传播行为,那到底什么是事务的传播行为呢?

1.什么是事务?

在数据库系统中,一个事务是指:由一系列数据库操作组成的一个完整的逻辑过程。例如银行转帐,从原账户扣除金额,以及向目标账户添加金额,这两个数据库操作的总和,构成一个完整的逻辑过程,不可拆分。这个过程被称为一个事务,具有ACID特性。

这里注意,其实事务就是数据库才能保证的,所以抛开数据库层面来谈事务本身就是不存在的,所以事务的概念就是数据库一系列操作的一个完整单元。

2.什么是ACID?

ACID是指数据库管理系统在写入或更新资料的过程中,为保证事务是正确可靠的,所必须具备的四个特性:原子性、一致性、隔离性、持久性。

  • Atomicity:一个事务中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。

  • Consistency:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。

  • Isolation:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔
    离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

  • Durability:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

3.spring事务传播行为

在我们用SSM开发项目的时候,我们一般都是将事务设置在Service层 那么当我们调用Service层的一个方法的时候它能够保证我们的这个方法中执行的所有的对数据库的更新操作保持在一个事务中,在事务层里面调用的这些方法要么全部成功,要么全部失败。那么事务的传播特性也是从这里说起的。

<重点1> 如果你在你的`Service`层的这个方法中,除了调用了`Dao`层的方法之外,还调用了本类的其他的`Service`方法,那么在调用其他的`Service`方法的时候,这个事务是怎么规定的呢,我必须保证我在我方法里调用的这个方法与我本身的方法处在同一个事务中,否则如果保证事物的一致性。事务的传播特性就是解决这个问题的.

在Spring中有针对传播特性的多种配置我们大多数情况下只用其中的一种:PROPGATION_REQUIRED:这个配置项的意思是说当我调用service层的方法的时候开启一个事务(具体调用那一层的方法开始创建事务,要看你的aop的配置),那么在调用这个service层里面的其他的方法的时候,如果当前方法产生了事务就用当前方法产生的事务,否则就创建一个新的事务。这个工作使由Spring来帮助我们完成的。

<重点2> 默认情况下当发生`RuntimeException`的情况下,事务才会回滚,所以要注意一下:如果你在程序发生错误的情况下,有自己的异常处理机制定义自己的`Exception`,必须从`RuntimeException`类继承,这样事务才会回滚!

4.事务隔离级别

  • 1、Serializable:最严格的级别,事务串行执行,资源消耗最大;
  • 2、REPEATABLE READ:保证了一个事务不会修改已经由另一个事务读取但未提交(回滚)的数据。避免了“脏读取”和“不可重复读取”的情况,但是带来了更多的性能损失。
  • 3、READ COMMITTED:大多数主流数据库的默认事务等级,保证了一个事务不会读到另一个并行事务已修改但未提交的数据,避免了“脏读取”。该级别适用于大多数系统。
  • 4、Read Uncommitted:保证了读取过程中不会读取到非法数据。

5.总结

本文的重点是在于理解事务的传播行为这个概念,从事务的概念,到事务的ACID介绍,引出事务传播传播行为和隔离级别这两个概念加以理解。