springboot编程式事务TransactionTemplate的使用说明
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简单使用
/** * 事务模板 * @author zz * */ 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; } }); } }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Java中操作Xml使用方法备忘录(Hutool工具类XmlUtil、XStream)
这篇文章主要给大家介绍了关于Java中操作Xml使用方法(Hutool工具类XmlUtil、XStream)的相关资料,XMLUtil是一个工具类,主要用于读取XML配置文件并提供相应的操作方法,文中通过代码介绍的非常详细,需要的朋友可以参考下2023-11-11java实现音乐播放器完整代码(调整显示音量大小、调整进度、图片切换)
这篇文章主要给大家介绍了关于java实现音乐播放器(调整显示音量大小、调整进度、图片切换)的相关资料,这本身是老师布置的一个作业,写完感觉不错分享给大家,需要的朋友可以参考下2023-07-07SpringBoot中的@Configuration注解详解
这篇文章主要介绍了SpringBoot中的@Configuration注解详解,Spring Boot推荐使用JAVA配置来完全代替XML 配置,JAVA配置就是通过 @Configuration和 @Bean两个注解实现的,需要的朋友可以参考下2023-08-08SpringMVC中@RequestMapping注解用法实例
通过@RequestMapping注解可以定义不同的处理器映射规则,下面这篇文章主要给大家介绍了关于SpringMVC中@RequestMapping注解用法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下2022-06-06基于Spring-cloud-gateway实现全局日志记录的方法
最近项目在线上运行出现了一些难以复现的bug需要定位相应api的日志,通过nginx提供的api请求日志难以实现,于是在gateway通过全局过滤器记录api请求日志,本文给大家介绍基于Spring-cloud-gateway实现全局日志记录,感兴趣的朋友一起看看吧2023-11-11Maven的porfile与SpringBoot的profile结合使用案例详解
这篇文章主要介绍了Maven的porfile与SpringBoot的profile结合使用,通过maven的profile功能,在打包的时候,通过-P指定maven激活某个pofile,这个profile里面配置了一个参数activatedProperties,不同的profile里面的这个参数的值不同,需要的朋友可以参考下吧2021-12-12
最新评论