事务管理在 Web 系统开发中是非常重要的,可以在一定程度上保证数据的一致性。Spring提供了非常优秀的事务管理机制,主要分为:
在代码中手动的管理事务的提交、回滚等操作,代码侵入性比较强。
try {// TODO transactionManager.commit(status);
} catch (Exception e) {transactionManager.rollback(status);throw new Exception("transaction fail");
}
基于 AOP 面向切面的,它将具体业务与事务处理部分解耦,代码侵入性很低,在实际开发中使用声明式事务用的比较多。
声明式事务也有两种实现方式,
显然基于注解的方式更简单易用。
@Transactional
public boolean updateUser(User user){return userMapper.updateById(user) > 0;
}
@Transactional 可以作用在接口、类、类方法。
如果把@Transactional 注解放在类上时,表示所有该类的public方法都配置相同的事务属性信息。
如果类配置了@Transactional,方法也配置了@Transactional,方法的事务会覆盖类的事务配置信息。
如果标注在 Interface 上并且配置了 Spring AOP 使用 CGLib 动态代理,将会导致@Transactional 注解失效,一般不使用在接口上。
表示事务的传播行为,默认值为 Propagation.REQUIRED
Propagation.REQUIRED:如果当前存在事务,则加入该事务,如果当前不存在事务,则创建一个新的事务。
Propagation.SUPPORTS:如果当前存在事务,则加入该事务;如果当前不存在事务,则以非事务的方式继续运行。
Propagation.MANDATORY:如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常。
Propagation.REQUIRES_NEW:重新创建一个新的事务,如果当前存在事务,暂停当前的事务。
Propagation.NOT_SUPPORTED:以非事务的方式运行,如果当前存在事务,暂停当前的事务。
Propagation.NEVER:以非事务的方式运行,如果当前存在事务,则抛出异常。
Propagation.NESTED :和 Propagation.REQUIRED 效果一样。
事务的隔离级别,默认值为 Isolation.DEFAULT
, 使用底层数据库默认的隔离级别。
Isolation.DEFAULT
Isolation.READ_UNCOMMITTED
Isolation.READ_COMMITTED
Isolation.REPEATABLE_READ
Isolation.SERIALIZABLE
事务的超时时间,默认值为 -1。如果超过该时间限制但事务还没有完成,则自动回滚事务。
指定事务是否为只读事务,默认值为 false;读取数据的时候,可以设置 read-only 为 true。
用于指定能够触发事务回滚的异常类型,可以指定多个异常类型。
抛出指定的异常类型,不回滚事务,也可以指定多个异常类型。