spring boot整合mybatis事务配置
接着上一篇文章,spring boot整合mybatis,需要配置事务。
只需要修改两个地方
一,service
事务主要是配置在处理业务逻辑的service层。在设计service层的时候,应该合理的抽象出方法包含的内容。然后将方法用@Trasactional注解注释,默认的话在抛出Exception.class异常的时候,就会触发方法中所有数据库操作回滚,当然这指的是增、删、改。
当然,@Transational方法是可以带参数的,具体的参数解释如下:
属性 | 类型 | 描述 |
---|---|---|
value | String | 可选的限定描述符,指定使用的事务管理器 |
propagation | enum: Propagation | 可选的事务传播行为设置 |
isolation | enum: Isolation | 可选的事务隔离级别设置 |
readOnly | boolean | 读写或只读事务,默认读写 |
timeout | int (in seconds granularity) | 事务超时时间设置 |
rollbackFor | Class对象数组,必须继承自Throwable | 导致事务回滚的异常类数组 |
rollbackForClassName | 类名数组,必须继承自Throwable | 导致事务回滚的异常类名字数组 |
noRollbackFor | Class对象数组,必须继承自Throwable | 不会导致事务回滚的异常类数组 |
noRollbackForClassName | 类名数组,必须继承自Throwable | 不会导致事务回滚的异常类名字数组 |
示例代码
@Service
public class TSUserServiceImpl implements TSUserService{
@Autowired
private TSUserDao tSUserDao;
@Transactional
public int insertTSUser(TSUser value){
return tSUserDao.insertTSUser(value);
}
@Transactional
public int insertNonEmptyTSUser(TSUser value){
return tSUserDao.insertNonEmptyTSUser(value);
}
@Transactional
public int insertTSUserByBatch(List<TSUser> value){
return tSUserDao.insertTSUserByBatch(value);
}
@Transactional
public int deleteTSUserById(String id){
return tSUserDao.deleteTSUserById(id);
}
@Transactional
public int deleteTSUser(Assist assist){
return tSUserDao.deleteTSUser(assist);
}
@Transactional
public int updateTSUserById(TSUser enti){
return tSUserDao.updateTSUserById(enti);
}
}
二,启动类
开启事务
最后你要在Application类中开启事务管理,开启事务管理很简单,只需要@EnableTransactionManagement注解就行
@SpringBootApplication
@EnableTransactionManagement
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
三,事务传播行为
关于propagation属性的7个传播行为
REQUIRED:指定当前方法必需在事务环境中运行,如果当前有事务环境就加入当前正在执行的事务环境,如果当前没有事务,就新建一个事务。这是默认值。
SUPPORTS:指定当前方法加入当前事务环境,如果当前没有事务,就以非事务方式执行。
MANDATORY:指定当前方法必须加入当前事务环境,如果当前没有事务,就抛出异常。
REQUIRES_NEW:指定当前方法总是会为自己发起一个新的事务,如果发现当前方法已运行在一个事务中,则原有事务被挂起,自己创建一个属于自己的事务,
一直我自己这个方法commit结束,原先的事务才会恢复执行。
NOT_SUPPORTED:指定当前方法以非事务方式执行操作,如果当前存在事务,就把当前事务挂起,等我以非事务的状态运行完,再继续原来的事务。
NEVER:指定当前方法绝对不能在事务范围内执行,如果方法在某个事务范围内执行,容器就抛异常,只有没关联到事务,才正常执行。
NESTED:指定当前方法执行时, 如果已经有一个事务存在,则运行在这个嵌套的事务中.如果当前环境没有运行的事务,就新建一个事务,
并与父事务相互独立,这个事务拥有多个可以回滚的保证点。就是指我自己内部事务回滚不会对外部事务造成影响,只对DataSourceTransactionManager事务管理器起效。
REQUIRED是默认值,示例代码中就没有写,也就是说service实现类话可以这样写
@Service
public class TSUserServiceImpl implements TSUserService{
@Autowired
private TSUserDao tSUserDao;
@Transactional
public int insertTSUser(TSUser value){
return tSUserDao.insertTSUser(value);
}
@Transactional(propagation = Propagation.REQUIRED)
public int insertNonEmptyTSUser(TSUser value){
return tSUserDao.insertNonEmptyTSUser(value);
}
@Transactional(propagation = Propagation.REQUIRED)
public int insertTSUserByBatch(List<TSUser> value){
return tSUserDao.insertTSUserByBatch(value);
}
@Transactional(propagation = Propagation.REQUIRED)
public int deleteTSUserById(String id){
return tSUserDao.deleteTSUserById(id);
}
@Transactional(propagation = Propagation.REQUIRED)
public int deleteTSUser(Assist assist){
return tSUserDao.deleteTSUser(assist);
}
@Transactional(propagation = Propagation.REQUIRED)
public int updateTSUserById(TSUser enti){
return tSUserDao.updateTSUserById(enti);
}
}
具体情况视需求而定,源代码下载