事务开启的两种方式

1.自动提交(注解事务)

1.方法上增加@Trasactional注解

        @Transactional注解是通过AOP方式实现的,默认捕获RuntimeException的异常并触发方法中所有数据库操作(增、删、改)回滚。如果自定义异常需要设置,@Transactional(rollbackOn = Exception.class)

2.在配置文件中或者启动类上开始事务

        SpringBoot在启动类上加@EnableTransactionManagement注解就行(开启注解事务管理,等同于xml配置方式的 <tx:annotation-driven />)

注:需要将异常异常信息抛出到上层框架,如果catch处理了的异常,不会被事物作为判断依据;如果异常被catch 了,但是又在catch中抛出了新的异常,那么事物会以这个新的异常作 为是否进行回滚的判断依据。

使用声明式注解时,除了向外层抛出异常外,我们还可以主动设置事务需要回滚(需要在方法上增加@Trasactional)

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

    @Transactional(rollbackOn = Exception.class)
    public void tranDelNoAutoZJ(String name) {
        User deleteUer = userRepository.findOneByName(name);
        if (deleteUer != null) {
            userRepository.deleteById(deleteUer.getId());
        }
        if (deleteUer.getId() % 2 == 0) {

        } else {
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            //主动设置事务需要回滚
        }
    }

2.手动事务

 

//这个是JDBC的事务管理器实现类,不同ORM使用不同,它的接口是PlatformTransactionManager
@Autowired 
DataSourceTransactionManager dataSourceTransactionManager;

//手动开启事务
@Autowired 
TransactionDefinition transactionDefinition; 

TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(transactionDefinition);

//手动提交事务
dataSourceTransactionManager.commit(transactionStatus);//提交

//手动回滚事务
//最好是放在catch 里面,防止程序异常而事务一直卡在哪里未提交
dataSourceTransactionManager.rollback(transactionStatus);

 

DataSourceTransactionManager 的继承图: 

 基于接口事务:

    /**
     * 事务管理器的接口
     */
    @Autowired
    private PlatformTransactionManager platformTransactionManager;

    /**
     * 接口
     */
    @Autowired
    private TransactionDefinition transactionDefinition;

   @Test
    public void manualTransactionalTest() {
        TransactionStatus transactionStatus = platformTransactionManager.getTransaction(transactionDefinition);
        try {
            UserInfo userInfo = new UserInfo();
            iUserInfoService.insertData(userInfo);

            UserInfo userInfo1 = new UserInfo();
            iUserInfoService.insertData(userInfo1);
            platformTransactionManager.commit(transactionStatus);
        } catch (Exception exception) {
            platformTransactionManager.rollback(transactionStatus);
        }
    }

Spring Mybatis开启事务

 @Autowired
    DataSourceTransactionManager dataSourceTransactionManager;

    public void tranDelNoAuto(String name) {
        DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition();
        TransactionStatus transactionStatus = dataSourceTransactionManager.getTransaction(defaultTransactionDefinition);
        User deleteUer = userRepository.findOneByName(name);
        if (deleteUer != null) {
            userRepository.deleteById(deleteUer.getId());
        }
        if (deleteUer.getId() % 2 == 0) {
            dataSourceTransactionManager.commit(transactionStatus);
        } else {
            dataSourceTransactionManager.rollback(transactionStatus);
        }
    }

Spring Data Jpa开启事务 

    @Autowired
    JpaTransactionManager jpaTransactionManager;

    public void tranDelNoAuto(String userName) {
        DefaultTransactionDefinition defaultTransactionDefinition = new DefaultTransactionDefinition();
        TransactionStatus transactionStatus = jpaTransactionManager.getTransaction(defaultTransactionDefinition);
        User delteUser = iUserDao.findByUsername(userName);
        if (delteUser != null) {
            iUserDao.deleteById(delteUser.getUserid());
        }
        if (delteUser.getUserid() % 2 == 0) {
            jpaTransactionManager.commit(transactionStatus);
        } else {
            jpaTransactionManager.rollback(transactionStatus);
        }
    }

3.TransactionTemplate手动提交事务

//注入TransactionTemplate  
 @Bean
 @ConditionalOnMissingBean
  public TransactionTemplate transactionTemplate() {
     //return new TransactionTemplate(this.dataSourceTransactionManager);
    return new TransactionTemplate();
  }
    @Autowired
    private TransactionTemplate transactionTemplate;

 @Test
    public void transactionTemplateTest() {
        transactionTemplate.execute((transactionStatus) -> {

            UserInfo userInfo = new UserInfo();
            iUserInfoService.insertData(userInfo);

            UserInfo userInfo1 = new UserInfo();     
            iUserInfoService.insertData(userInfo1);
            return true;
        });
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值