for循环中循环一次提交一次 insert update 关闭事务 spring springboot mybatis

省流:

在方法上直接加如下注解:

java 复制代码
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void t1(){
    //业务代码
}

正文:

在测试的时候,有时候会希望在for循环中,代码循环一次就提交一次事务。

方法一:

最简单的方式,就是关闭事务,不需要事务。添加注解如下:

java 复制代码
@Transactional(propagation = Propagation.NOT_SUPPORTED)
public void t1(){
    //业务代码
}

方法二:

如果说是真的在生产上有这样的需要,每循环一次就提交事务,那就需要手动控制事务了。

需要这几行代码:

java 复制代码
            DefaultTransactionDefinition dt = new DefaultTransactionDefinition();
            dt.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
            TransactionStatus status = platformTransactionManager.getTransaction(dt);
            platformTransactionManager.commit(status);

用法如下:

java 复制代码
    @Autowired
    private PlatformTransactionManager platformTransactionManager;
    
    @Test
    public void t1(){
        for(int i=0; i<list.size(); i++){
            DefaultTransactionDefinition dt = new DefaultTransactionDefinition();
            dt.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
            TransactionStatus status = platformTransactionManager.getTransaction(dt);
            mapper.select(o);
            mapper.insert(o);
            platformTransactionManager.commit(status);
        }
    }

具体解读请前往以下两篇文章:

Transactional的7种Propagation:

spring springboot mybatis 事务配置 Transactional的Propagation 开启事务 关闭事务_globalcoding的博客

开启和关闭事务时sqlsession创建机制,手动控制事务时sqlsession 创建机制:

spring springboot mybatis transaction 开启事务 关闭事务 不使用事务_globalcoding的博客

=====================分割线=========================

文章到此已经结束,以下是紫薯补丁

@Transactional(propagation = Propagation.NOT_SUPPORTED)

public void t1(){

//业务代码

}

@Autowired

private PlatformTransactionManager platformTransactionManager;

@Test

public void t1(){

for(int i=0; i<list.size(); i++){

DefaultTransactionDefinition dt = new DefaultTransactionDefinition();

dt.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW);

TransactionStatus status = platformTransactionManager.getTransaction(dt);

mapper.select(o);

mapper.insert(o);

platformTransactionManager.commit(status);

}

}

相关推荐
无知的小菜鸡6 小时前
SSM学习4:spring整合mybatis、spring整合Junit
spring·mybatis
人生偌只如初见6 小时前
MyBatis学习笔记-数据脱敏
java·mybatis
IT云清6 小时前
Apache Seata透过源码解决SeataAT模式整合Mybatis-Plus失去MP特性的问题
apache·mybatis
一路向北·重庆分伦7 小时前
03:Spring MVC
java·spring·mvc
白云如幻8 小时前
Spring解耦合分析和总结
java·spring
java6666688889 小时前
实现基于Spring Boot的Web安全防护
spring boot·web安全·mybatis
添砖JAVA的小墨9 小时前
构建安全稳定的应用:SpringSecurity实用指南
spring
奋斗的袍子00710 小时前
SpringBoot:SpringBoot统一响应和统一异常处理
java·spring boot·后端·spring·统一异常处理·统一响应·自定义异常
xmh-sxh-131411 小时前
Spring MVC中的DispatcherServlet、HandlerMapping和ViewResolver的作用
spring
一杯梅子酱11 小时前
Spring Boot 中使用 Spring Security 实现安全访问权限管理:详尽指南
spring boot·安全·spring