springboot编程式事务TransactionTemplate的使用说明
作者:yzh_1346983557 发布时间:2022-03-01 15:19:37
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;
}
});
}
}
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
来源:https://blog.csdn.net/yzh_1346983557/article/details/118492783


猜你喜欢
- Android 客户端RSA加密的实现方法针对java后端进行的RSA加密,android客户端进行解密,结果是部分乱码的问题:注意两点,编
- 前言在项目中,如果我们要遵循分层领域模型规约: 话,肯定避免不了在DTO、VO、BO、AO、VO、Query等实体的转换,我们通常有几种做法
- 花了2天时间,彻底搞清C#中cookie的内容,搞清以下内容将让你对所有网站的cookie都尽在掌握之中.cookieCollection是
- synchronized都问啥?如果Java面试有什么是必问的,synchronized必定占据一席之地。初出茅庐时synchronized
- @SpringBootTest加速单元测试小诀窍PreSpringBoot - 应用程序测试方案随着代码量的争夺,测试类的启动速度变得越来越
- 本文实例讲述了Java统计字符串中字符出现次数的方法。分享给大家供大家参考,具体如下:package com.wenzhi;import j
- 大家好,今天尝试用swing技术写一个贪吃蛇大作战小游戏,供大家参考。 效果展示效果展示一、游戏界面二、得分情况&nb
- QTableWidget 是 Qt 中的表格组件类。在窗体上放置一个 QTableWidget 组件后,可以在 Property Edito
- 优点1.一个调用者想创建一个对象,只要知道其名称就可以了。2.扩展性高,如果想增加一个产品,只要扩展一个工厂类就可以。3.屏蔽产品的具体实现
- 首先,来看一下,快速排序的实现的动态图:快速排序介绍:快速排序,根据教科书说法来看,是冒泡排序的一种改进。快速排序,由一个待排序的数组(ar
- Kotlin this详解及实例为了表示当前函数的接收者(receiver), 们使用this表达式:在类的成员函数中,this指向这个类的
- 前言:sleep 方法和 wait 方法都是用来将线程进入休眠状态的,并且 sleep 和 wait 方法都可以响应 interrupt 中
- 为了保持类型的安全性,默认情况下 C# 是不支持指针的,但是如果使用 unsafe 关键字来修饰类或类中的成员,这样的类或类中成员就会被视为
- 解析得到的代码能通过XHTML 1.0 STRICT验证;包含了标题,链接,字体,对齐,图片,引用,列表等方面的功能.&
- 完整代码:https://github.com/iyuanyb/Downloader多线程下载及断点续传的实现是使用 HTTP/1.1 引入
- Wrapper条件构造器updateForSet更新官方文档:https://baomidou.gitee.io/mybatis-plus-
- 1.摘要Android手机间通过蓝牙方式进行通信,有两种常见的方式,一种是socket方式,另一种是通过Gatt Server(Androi
- 数据类型转换就是将数据(变量、表达式的结果)从一种类型转换到另一种类型。例如,为了保存小数你可以将int类型的变量转换为double类型。数
- Spring session 获取当前账户登录数一、登录校验成功时,向session加入关键信息,代码如下:session.setAttri
- 当目标数据库不能直连的,需要一个服务器作为中间跳板的时候,我们需要通过SSH通道连接数据库。ps:使用ssh连接,相当于本地开了个端口去连接