文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

springboot编程式事务TransactionTemplate的使用说明

2024-04-02 19:55

关注

TransactionTemplate的使用

总结:在类中注入TransactionTemplate,即可在springboot中使用编程式事务。

spring支持编程式事务管理和声明式事务管理两种方式。

编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。

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

1.为何用?

多数情况下,方法上声明@Transactional注解声明事务即可,简单、快捷、方便,但@Transactional声明式事务的可控性太弱了,只可在方法或类上声明,做不到细粒度的事务控制。

如果一个方法前10条sql都是select查询语句,只有最后2条sql是update语句,那么只对最后2条sql做事务即可。

2.如何用

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>

springboot中引入mybatis-spring-boot-starter依赖包即可。

mybatis-spring-boot-starter依赖包中包含了spring-boot-starter-jdbc的依赖,spring-boot-starter-jdbc中包含DataSourceTransactionManager事务管理器以及自动注入配置类DataSourceTransactionManagerAutoConfiguration。

代码中使用,在使用bean中注入TransactionTemplate即可:

@Service
public class TestServiceImpl {
    @Resource
    private TransactionTemplate transactionTemplate;
    public Object testTransaction() {
        //数据库查询
        dao.select(1);
        return transactionTemplate.execute(status -> {
            //数据库新增
            dao.insert(2);
            dao.insert(3);
            return new Object();
        });
    }
}

TransactionTemplate简单使用

 
public class TransactionTemplateSupport {
	@Autowired
	private PlatformTransactionManager transactionManager;	
	private TransactionTemplate requiredTransactionTemplate;	
	protected TransactionTemplate getRequiresNewTransactionTemplate(){
		if (requiredTransactionTemplate == null){
			requiredTransactionTemplate = new TransactionTemplate(transactionManager);
			requiredTransactionTemplate.setPropagationBehavior(TransactionTemplate.PROPAGATION_REQUIRED);
		//	requiredTransactionTemplate.setReadOnly(true);
		//	requiredTransactionTemplate.setTimeout(30000);
		}
		
		return requiredTransactionTemplate;
	} 
}
@Service
public class TestTransaction extends TransactionTemplateSupport  { 
    @Autowired
    private JdbcTemplate jdbcTemplate ;
 
    @Autowired
    private TransactionTemplate transactionTemplate;
 
   // @Transactional
    public void test(){
 
        jdbcTemplate.execute("insert into user value (1,'aaa','aaa','aaa')"); 
        int i = 1/0; 
        jdbcTemplate.execute("insert into user value (2,'aaa','aaa','aaa')"); 
    } 
 
    public void test2(){ 
      getRequiresNewTransactionTemplate()
      //  transactionTemplate
                .execute(new TransactionCallback<Void>() {
 
            @Override
            public Void doInTransaction(TransactionStatus status) {  
                jdbcTemplate.execute("insert into user value (11,'BBBB','aaa','aaa')");
 
                int i = 1/0; 
                jdbcTemplate.execute("insert into user value (21,'aaa','NNNN','aaa')");  
                return null;
            }
        });
    }  
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。 

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯