spring编程式事务和声明式事务

目录

编程式事务

简单案例

TransactionTemplate

 PlatformTransactionManager

声明式事务

简单使用

简单实例

@Transactional常用属性

事务传播行为

 需要注意的点


编程式事务

编程式事务管理是侵入性事务管理,使用TransactionTemplate或者直接使用PlatformTransactionManager,对于编程式事务管理,Spring推荐使用TransactionTemplate

简单案例

TransactionTemplate

@Configuration
public class MyPlatformTransactionManager {
    @Bean
    public TransactionTemplate transactionTemplate(PlatformTransactionManager platformTransactionManager){
        TransactionTemplate transactionTemplate = new TransactionTemplate();
        transactionTemplate.setTransactionManager(platformTransactionManager);
        return transactionTemplate;
    }
}
    @Autowired
    TransactionTemplate transactionTemplate;
    

    @Override
    public int insertTran(int id, String username, String password) {
        Integer p = transactionTemplate.execute(status -> {
            userService.insertTran(8, "dd", "ff");
            userService.insertTran(9, "dd", "ff");
            userService.insertTran(10, "dd", "ff");
            int i = userService.insertTran(id, username, password);
            return i;
        });
        return p;
    }

 PlatformTransactionManager

    @Autowired
    private PlatformTransactionManager txManager ;

    //模板
        DefaultTransactionDefinition def = new DefaultTransactionDefinition();
        TransactionStatus status = txManager.getTransaction(def);
        int result = 0;
        try {
            result=//dosomething
            txManager.commit(status);
        }catch (Exception e){
            txManager.rollback(status);
        }
        return result;

声明式事务

声明式事务管理建立在AOP之上,其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,执行完目标方法之后根据执行的情况提交或者回滚。

简单使用

第一步,注解开启支持

@EnableTransactionManagement

第二步,在想要事务管理的服务层加上事务管理注解

@Transactional

简单实例

拿最简单的插入语句来说,我们想要实现多个插入,只要有一个插入不成功就全部回滚

只需要在插入的方法上使用@Transactional即可

    @Override
    @Transactional
    //随便模拟了一个插入,id是主键,如果id重复出现异常,则全部回滚
    public int insertTran(int id, String username, String password) {
        userService.insertTran(5,"dd","ff");
        userService.insertTran(6,"dd","ff");
        userService.insertTran(7,"dd","ff");
        int i = userService.insertTran(id, username, password);
        return i;
    }

@Transactional常用属性

propagation:事务的传播行为,默认值为 REQUIRED。

isolation:事务的隔离度,默认值采用 DEFAULT。

timeout:事务的超时时间,默认值为-1,不超时。如果设置了超时时间(单位秒),那么如果超过该时间限制了但事务还没有完成,则自动回滚事务。

read-only:指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true。

rollbackFor:用于指定能够触发事务回滚的异常类型,如果有多个异常类型需要指定,各类型之间可以通过逗号分隔。{xxx1.class, xxx2.class,……}

noRollbackFor:抛出 no-rollback-for 指定的异常类型,不回滚事务。{xxx1.class, xxx2.class,……}

事务传播行为

在我们执行一个事务方法时,另一边也同时执行了该方法。那么我们这个时候就要通过事务传播来处理。

spring编程式事务和声明式事务_第1张图片

 需要注意的点

  • 我们一般不在接口上写@Transactional
  • @Transactional只能用在public的方法上
  • @Transactional标注的方法如果时非运行时异常,则不会回滚
  • 如果我们往上抛Exception异常(非运行时异常),我们可以指定rollbackFor属性来回滚

你可能感兴趣的:(开发,spring,java,后端)