02、mybatis-spring开启事务

本文主要介绍mybatis-spring如何开始事务。

什么是事务,抄了一段网上的解释:事务(Transaction)是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。通过事务,能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。主要用于一些对操作过程的完整性比较高的程序。比如银行系统,用户在转账权的过程中程序出现错误,但是这个转账操作没有完成。那么这个操作就被退回。

就是为了保证业务的一致性,要嘛都成功,如果有一个失败,那其他成功的就应该回滚。

在使用前我们看下mybatis-spring的文档:http://mybatis.org/spring/zh/transactions.html

文档开篇有句很重要的话

“MyBatis 参与到 Spring 的事务管理中。而不是给 MyBatis 创建一个新的专用事务管理器,MyBatis-Spring 借助了 Spring 中的 DataSourceTransactionManager 来实现事务管理”,就是说事务由spring接管了和mybatis没多大关系了。

下面开始配置事务。

02、mybatis-spring开启事务_第1张图片

按照文档,我们需要在本地配置一个DataSourceTransactionManager的bean

@Bean(name="transactionManager")
public DataSourceTransactionManager transactionManager(@Qualifier("dataSource") DataSource dataSource) {
    return new DataSourceTransactionManager(dataSource);
}

这里需要注意的是方法形参需要一个dataSource,这个dataSource要和你创建的sqlSessionFactory用到的dataSource是同一个东西,不然会有问题。DataSourceTransactionManager是spring自己的,专门用来管理事务的。

接下来是选择“交由容器管理事务”和“编程式事务管理”02、mybatis-spring开启事务_第2张图片

02、mybatis-spring开启事务_第3张图片

交由容器管理事务没有过,本文讲下编程式事务。如果想编程式控制事务,文中也提供了Spring官网编程式事务的文档入口地址。

接下来我们通过注解的方式来开启注解。

@Configuration
@EnableTransactionManagement
public class Appconfig {
}

在任意的一个配置类中加入上面注解,然后再把这个配置类交由spring管理,这样我们就已经开启了事务。

然后在需要添加事务的方法上面加入下面注解

@Transactional
@Override
public User deleted(String userId){

}

感兴趣的可以看下Transactional注解的属性,下面指出了常用的几个属性

1、transactionManager :用来指定事务管理器,比如我们有多个数据源,不通过数据源不同事务管理器。
2、rollback-for : 用于指定异常类型,触发回滚。如果有多个异常类型需要指定,各类型之间可以通过逗号分隔。
3、no-rollback- for  :抛出指定的异常类型,不回滚事务。

方式二、手动commit或者rollback

@Service
public class UserServiceImpl implements UserService{

    @Autowired
    private UserMapper userMapper;

    @Resource
    DataSourceTransactionManager transactionManager;

    @Override
    public void deleted(String userId) throws Exception {
        
		TransactionStatus txStatus =
                transactionManager.getTransaction(new DefaultTransactionDefinition());
        try {
            userMapper.delete(userId);
            throw new Exception();
        } catch (Exception e) {
            transactionManager.rollback(txStatus);
            throw e;
        }
    }
}

1、注入DataSourceTransactionManager然后手动触发commit或者rollback。注意这种方式不需要添加EnableTransactionManagement和@Transactional注解。

你可能感兴趣的:(mybatis)