Spring事务
事务传播特性
名称 | 说明 |
---|---|
PROPAGATION_REQUIRED | 默认的spring事务传播级别,如果上下文中已经存在事务,就加入到事务中执行,否则新建事务执行。 |
PROPAGATION_SUPPORTS | 不关心有没有事务,如果上下文存在事务,则支持事务加入事务,否则以非事务的方式执行。 |
PROPAGATION_MANDATORY | 必须运行在一个事务中,如果当前没有事务正在发生,将抛出异常。 |
PROPAGATION_REQUIRES_NEW | 当前方法必须在它自己的事务里运行。每次都会新建一个事务,并且同时将上下文中的事务挂起,当前新建事务完成后,上下文事务再恢复执行。 |
PROPAGATION_NOT_SUPPORTED | 不支持在事务中运行。如果存在事务则将其挂起,当前逻辑执行完后在恢复事务运行。 |
PROPAGATION_NEVER | 不能在事务中运行,如果当前有事务正在发生,则会抛出异常。 |
PROPAGATION_NESTED | 如果上下文中存在事务,则嵌套事务执行,嵌套的事务可以独立于封装事务进行提交或回滚;如果不存在事务,则新建事务。 |
事务隔离级别
名称 | 说明 |
---|---|
ISOLATION_DEFAULT | 使用数据库的默认隔离级别 |
ISOLATION_READ_UNCOMMITTED | 未提交读 |
ISOLATION_READ_COMMITTED | 提交读 |
ISOLATION_REPEATABLE_READ | 可重复读 |
ISOLATION_SERIALIZABLE | 串行化 |
SpringBoot中事务的简单实现
方法一:@Transactional 注解
使用 @Transactional 注解声明方法的事务特性,可配置 propagation 等参数实现事务的管理。
@Transactional
public void tran() {
tranA();
tranB();
}
@Transactional(propagation=Propagation.SUPPORTS)
tranA();
@Transactional(propagation=Propagation.NESTED)
tranB();
方法二:TransactionTemplate
用自动配置的 TransactionTemplate,执行 execute 方法,并将需要在事务中执行的动作在 doInTransaction 方法中,即可实现事务。同时,可使用 transactionTemplate.setPropagationBehavior() 和 transactionTemplate.setIsolationLevel() 来设置事务传播特性和隔离级别。
@Autowired
TransactionTemplate transactionTemplate;
public void transactionExample() {
log.info("count in table example: {}", exampleRepository.count());
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
exampleRepository.save(new Example());
log.info("count in table example: {}", exampleRepository.count());
transactionStatus.setRollbackOnly();
}
});
log.info("count in table example: {}", exampleRepository.count());
}
/*
当 exampleRepository 初始为空时,日志输出:
count in table example: 0
count in table example: 1
count in table example: 0
*/