Spring支持使用声明式事务,即使用注解来选择需要使用事务的方法,这是一个基于AOP的实现操作,通过在方法开始之前创建/加入一个事务,在执行完方法之后根据方法是否有异常来决定提交事务还是将数据回滚。(导包的时候记得这个注解来自springFrameork,而不是javax)。既然是声明式,那就可以自选属性来定制事务行为
属性 |
含义 |
默认值 |
propagation |
Propagation定义了事务的生命周期,主要有以下选项 REQUIRED:方法A调用时没有事务则创建一个事务,当在方法A调用另一个方法B的时候,方法B将使用相同的事务;如果方法B发生异常需要事务回滚的时候,整个事务数据回滚 REQUIRES_NEW:对于方法A和B,在方法调用的时候无论是否有事务都会开启一个新的事务。如果这样的话,方法B有异常不会导致方法A的数据回滚 NESTED: 和REQUIRES_NEW类似,但支持JDBC,不支持JPA(Hibernate) SUPPORTS:方法调用时有事务就用事务,没事务就不用事务 NOT_SUPPORTED:强制方法不在事务中执行,如果该方法有事务,在方法调用到结束阶段事务都将会被挂起 NEVER:强制方法不在事务中执行。如果该方法有事务则抛出异常 MANDATORY:强制方法在事务中执行,若无事务就抛异常
|
REQUIRED |
isolation |
Isolation(隔离)决定了事务的完整性,处理在多事务对相同数据下的处理机制,主要包含下面的隔离级别(不能随意设置,需要看当前数据库是否支持) READ_UNCOMMITTED:对于A事务里修改了一条数据但没有提交事务,在事务B仍然可以读取到修改后的记录,可导致脏读 幻读 不可重复读 READ_COMMITTED:对于A事务里修改了一条数据且提交之后,事务B才可以读取提交后的数据。可以阻止脏读,但可能导致不可重复读和幻读 REPEATABLE_READ:不仅能实现READ_COMMITTED的功能,还能阻止当A读取了一条记录,事务B将不允许修改这条记录。阻止脏读和不可重复度 但可能出现幻读 SERIALIZABLE:此级别下的事务是按顺序执行的,可避免上述所有问题,但开销较大 DEFAULT:指当前数据库的默认隔离级别。比如Oracle,Sql Server是READ_COMMITTED;Mysql是REOEATABLE_READ; |
DEFAULT |
timoout |
timeout指定事务过期时间,默认为当前数据库的事务过期时间 |
TIMEOUT_DEFAULT |
readOnly |
指定当前事务是否是只读事务 |
false |
rollbackFor | 指定哪个/哪些异常可以引起事务回滚 | Throwable的子类 |
noRollbackFor | 指定哪个/哪些异常不会引起事务回滚 | Throwable的子类 |
Spring boot的DataSourceTransactionManagerAutoConfiguration类里已经加了@EnableTransactionManagement直接,所以无需再手动开启事务支持