Spring事务的传播机制是指 多个事务方法互相调用时(如当A类a方法调用B类中的b方法时,那么B类中的b方法是按b方法的事务还是A类中a方法的事务来执行),事务如何在这些方法之间进行传播。在事务的管理过程中,传播行为可以控制是否需要创建事务以及事务如何创建。Spring提供了7种不同的传播特性来保证事务的正常执行。
事务的类型 | 事务的作用 |
Required(必须的) | 默认的传播特性,如果当前没有事务,则新建事务,否则加入这个事务。 例如:a方法调用b方法,如果a方法存在事务,则b方法就按a方法的事务来执行,如果a方法不存在事务,那么b方法就自己新建事务 |
Supports(支持的) | 如果当前存在事务,则加入当前事务,否则以非事务的方式执行, 例如:a方法调用b方法,如果a方法存在事务,那么b方法就按a方法的事务来执行,如果a方法不存在事务,那么b方法就以非事务的方法执行 |
Mandatory(强制的) | 如果当前存在事务,则加入事务,否则抛出异常 例如:a方法存在事务,那么b方法就按a方法的事务来执行,如果a方法不存在事务,那么b方法就抛出异常 |
Required_new | 创建一个新事务,如果当前存在事务,则挂起事务。 例如:如果a方法存在事务,那么a方法自己的事务就会被挂起,然后b方法就会创建自己新的事务来执行。如果a方法不存在事务,b方法也是新建事务来执行 |
Not_supported | 以非事务的方式执行,如果当前存在事务,则挂起事务。 例如L不管a方法存不存在事务,b方法都是以非事务的方式执行 |
Never | 不使用事务,如果当前存在事务,则抛出异常 例如:a方法存在事务,那么b方法会抛出异常。如果a方法不存在事务,那么b方法按非事务的方式执行 |
Nested | 如果当前事务存在,则嵌套在事务中执行,否则和Required的操作一样 例如:a方法调用b方法,如果a方法当前存在事务,则会在a方法的事务执行过程中设置一个保存点,然后b方法会按a方法的事务执行,如果b方法执行失败,则会回滚到之前设置的保存点,否则b方法自己新建事务来执行。 |
🐂 挂起事务:所谓挂起事务是指,比如有两个方法AB,A方法支持事务,B方法不支持事务,那么A方法中对于数据库的操作是在事务的控制下完成的,而在A方法中调用B方法,那么A方法中开启的事务会挂起,B方法中的数据库操作不在事务的控制下完成,当B方法执行完成返回后,A方法继续在事务的控制下进行相关的数据库操作。
Required和Required_new的区别: Required_new是新建一个事务并且新开启的事务和原有的事务无关,而Required则是如果当前没有事务,则新建事务,否则加入这个事务。
Nested和Required的区别: Required情况下,调用方a存在事务时,则被调用方b和调用方a使用同一个事务,那么被调用方b出现异常时,由于共同使用同一个事务,所以无论是否捕获异常,事务都会回滚,而在Nested下,被调用方b发生异常时,调用方a可以捕获异常,这样只有子事务回滚,父事务不会回滚。