赞
踩
目录
事务管理是应用系统开发中必不可少的一部分。Spring 为事务管理提供了丰富的功能支持。
Spring 事务管理分为编程式和声明式的两种方式。
编程式事务指的是通过编码方式实现事务;声明式事务基于 AOP,将具体业务逻辑与事务处理解耦。
声明式事务管理使业务代码逻辑不受污染, 因此在实际使用中声明式事务用的比较多。
声明式事务有两种方式:
一种是在配置文件(xml)中做相关的事务规则声明;
另一种是基于 @Transactional
注解的方式。
本文将着重介绍基于 @Transactional
注解的事务管理,首先需要明确两点:
1.默认配置下 Spring 只会回滚运行时、未检查异常(继承自 RuntimeException 的异常)或者 Error。2.@Transactional
注解只能应用到 public 方法才有效。
以下的示例使用的是 mybatis,所以 spring boot 会自动配置一个 DataSourceTransactionManager
,我们只需在方法(或者类)加上 @Transactional
注解,就自动纳入 Spring 的事务管理了。
只需在方法加上 @Transactional
注解就可以了。
如下有一个保存用户的方法,加入 @Transactional
注解,使用默认配置,抛出异常之后,事务会自动回滚,数据不会插入到数据库。
@Transactional @Override public void save() { User user = new User("服部半藏"); userMapper.insertSelective(user); if (true) { throw new RuntimeException("save 抛异常了"); } }
我们可以从日志里面看出这些信息
@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface Transactional { @AliasFor("transactionManager") String value() default ""; @AliasFor("value") String transactionManager() default ""; Propagation propagation() default Propagation.REQUIRED; Isolation isolation() default Isolation.DEFAULT; int timeout() default -1; boolean readOnly() default false; Class<? extends Throwable>[] rollbackFor() default {}; String[] rollbackForClassName() default {}; Class<? extends Throwable>[] noRollbackFor() default {}; String[] noRollbackForClassName() default {}; }
下面分别介绍一下 @Transactional
的几个属性。
它们两个是一样的意思。当配置了多个事务管理器时,可以使用该属性指定选择哪个事务管理器。
事务的传播行为,默认值为 Propagation.REQUIRED。
可选的值有:
Propagation.REQUIRED :如果当前存在事务,则加入该事务,如果当前不存在事务,则创建一个新的事务。
Propagation.SUPPORTS:如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务的方式继续运行。
Propagation.MANDATORY:如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常。
Propagation.REQUIRES_NEW:重新创建一个新的事务,如果当前存在事务,暂停当前的事务。
Propagation.NOT_SUPPORTED:以非事务的方式运行,如果当前存在事务,暂停当前的事务。
Propagation.NEVER:以非事务的方式运行,如果当前存在事务,则抛出异常。
Propagation.NESTED和 Propagation.REQUIRED 效果一样。
这些概念理解起来实在是有点儿抽象,后文会用代码示例解释说明。
public enum Isolation { DEFAULT(-1), READ_UNCOMMITTED(1), READ_COMMITTED(2), REPEATABLE_READ(4), SERIALIZABLE(8); private final int value; private Isolation(int value) { this.value = value; } public int value() { return this.value; } }
事务的隔离级别,默认值为 Isolation.DEFAULT
。
可选的值有:
Isolation.DEFAULT
使用底层数据库默认的隔离级别。
Isolation.READ_UNCOMMITTED Isolation.READ_COMMITTED Isolation.REPEATABLE_READ Isolation.SERIALIZABLE
事务的超时时间,默认值为-1。如果超过该时间限制但事务还没有完成,则自动回滚事务。
指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true。
用于指定能够触发事务回滚的异常类型,可以指定多个异常类型。
抛出指定的异常类型,不回滚事务,也可以指定多个异常类型。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。