附加:Spring Boot项目,手动控制事务;(包括:总结了到目前为止,事务的所有内容;)

说明:

(1) 为什么写本篇博客?:在【Spring Boot电商项目53:订单模块二:【前台:创建订单】接口;】中,我们需要在Spring Boot项目中,去手动控制事务;为此,我们从头总结了事务的内容;

(2)声明:

          ● 本篇博客可能存在理解不准确,甚至是理解错误的地方;但目前,其能够帮助自己勉强形成自洽;

          ● 本篇博客的内容,其实挺简单的;

目录

一:有关MySQL、JDBC、Apache Commons DbUtils,Mybatis、Spring JDBC的事务控制机制:可以先看下以前总结的这篇文章;

二:在SSM + Mybatis-Plus项目中,事务的使用;

三:Spring Boot项目中,事务的使用;

四:什么时候需要我们去手动控制事务; 


一:有关MySQL、JDBC、Apache Commons DbUtils,Mybatis、Spring JDBC的事务控制机制:可以先看下以前总结的这篇文章;

          ● 有关MySQL、JDBC、Apache Commons DbUtils,Mybatis、Spring JDBC的事务控制机制,可以先参考【, 附加:(补):MySQL、JDBC、Apache Commons DbUtils,Mybatis、Spring JDBC:【数据库连接,DataSource数据源,事务控制】的总结和梳理;】;

          ● 这篇文章,总结还算可以,需要认真、快速的看一遍;


 

二:在SSM + Mybatis-Plus项目中,事务的使用;

可以参考【(17)SSM开发书评网】中的内容;

在这个SSM+Mybatis-Plus项目中,我们配置了【Spring JDBC的声明式事务,并采用了注解形式来配置声明式事务】来管理操作数据库时的事务;

          ● 在SSM项目中,有关Spring JDBC的声明式事务的配置,可以参考【SSM开发书评网6:项目准备与SSM整合四:整合【logback日志】,【声明式事务】 ,【JUnit单元测试】;】;

          ● 然后,声明式事务在程序中的使用案例,可以参考【SSM开发书评网11:图书列表分页及查询一:显示图书类别;(本篇博客是【SSM+Mybatis-Plus】的第一次标准流程演示)】和【SSM开发书评网21:完成会员注册功能;(本篇博客包含了【开启事务、自定义异常、MD5加盐混淆、util.Date和sql.Date】等大量前面介绍过的知识)】等;主要就是,在Service层上使用@Transactional注解;然后,根据该Service中的方法究竟需不需要开启手动控制事务,进行相应的设置;

疑问:所以,这儿就有了一个疑问:【Spring JDBC的声明式事务】是Spring JDBC的,那么【Spring JDBC的声明式事务】为什么能够对【我们使用Mybatis操作数据库】起作用;

……………………………………………………

解答:这个解答,有一定的前后脉络:

(1)首先,要明确【Spring JDBC】和【Mybatis】是两个不同的东西;甚至这两个产品还是竞争关系;可以参考【Spring JDBC与事务管理1:Spring JDBC一:Spring JDBC简介;】;

(2)Spring JDBC执行效率高、贴合Spring;按理说,有了Spring JDBC,我们就完全可以告别Mybatis;

(3)但是,虽然Mybatis略显笨重;但是尤其其封装程度高(PS:一般封装程度越高,其执行效率就会越低;但封装程度越高,也往往就意味着操作越简单),而且在业界中Mybatis还是被广泛使用的;所以,我们目前在项目中,还是需要使用Mybatis去操作数据库的;

(4)自然,Mybatis也提供了事务控制机制;

PS:一个仍然未解决的问题:可以看到,我们并没有写【conn.setAutoCommit(false);】这种类似的语句来开启手动管理事务;这是为什么?目前的一个可以勉强糊弄自己的解释:主要原因就是在连接池中取出的连接,都会将调用 connection.setAutoCommit(false)方法,来关闭自动事务控制,这样我们就必须使用 sqlSession.commit()方法,相当于使用了 JDBC 中的 connection.commit()方法实现事务提交。这句话参考自【Mybatis 的事务控制】;

(5)既然在操作数据库的时候,都没使用Spring JDBC,而是使用的Mybatis去操作数据库;那么,为什么,我们不依旧使用Mybatis的事务控制机制,而是要使用Spring JDBC的事务控制机制呐?

(6)我们为什么不在Spring项目中,使用Mybatis的事务控制机制,主要有这两个原因:(纯个人理解)

          ● Mybatis本身的事务控制,不太好:使用Mybatis去管理事务的时候,我们需要把事务控制的语句写在业务代码中;也就是说,我们需要在业务代码中,通过调用api来实现事务控制;(PS:这和Spring JDBC的编程式事务挺像的,都是需要在在业务代码中,通过调用api来管理事务;;;;而,这种在需要事务控制的地方,就编写事务控制语句的方式,是不太好的:开发麻烦、不简明,容易出错;;;;;很容易想到,Spring JDBC有两种事务控制机制:编程式事务和声明式事务;;;;这也是为什么我们选用声明式事务,而没有选用编程事务的原因;)

          ● Spring JDBC的声明式事务,可以很好的使用Spring的优点:因为,我们这个是Spring项目,Spring最给力的就是其IoC和AOP机制;使用Spring JDBC的声明事务后,我们再去管理事务的时候,就可以很好的使用Spring本身具有的优点了;

(7)那么【Spring JDBC的声明式事务】为什么能够对【我们使用Mybatis操作数据库】起作用;作以下解释:

          ● 首先,Spring+Mybatis项目,我们需要配置:可以参考【SSM开发书评网5:项目准备与SSM整合三:Spring与Mybatis整合;】;

          ● 即,在整合Spring和Mybatis的时候,【Spring为了能够整合Mybatis,而提供的org.mybatis.spring.SqlSessionFactoryBean;我给这个配置的数据源】要和【Spring为了能够管理事务,而需要配置的DataSourceTransactionManager事务管理器对象;我们给这个配置的数据源】要指向同一个数据源;;;;只要我们这样配置了,MyBatis自动参与到spring事务管理中,无需额外配置;

(8)使用【Spring JDBC的声明式事务】来管理【我们使用Mybatis操作数据库】时的事务,的好处;

          ● Spring JDBC声明事务借助了AOP技术,同时我们配置了注解形式的声明式事务;那么,此时我们再去进行手动控制事务的时候,就比较简单了;


 

三:Spring Boot项目中,事务的使用;

我们知道,和Spring MVC相比,Spring Boot的特点是:约定优于配置(Convention Over Configuration);

我们在创建Spring Boot项目的时候,对于Spring JDBC的声明式事务,我们不需要配置;Spring Boot已经帮我们做好了,我们直接用就可以;


 

四:什么时候需要我们去手动控制事务; 

(1)简单来说,如果完成某个业务,只需要一条SQL语句(尤其是增删改语句),那么MySQL的自动提交事务的模式是没有问题的;

(2)某些业务,需要多条SQL语句的时候;而且,我们要求,多条语句要么全部执行、要么一个也不执行的时候;我们就需要把这个多条语句归到同一个事务中去;那么此时,就需要我们手动去控制事务了;

(3)关于这个点,在【MySQL综合应用二:事务机制一:事务的基本介绍】中,有比较详细的介绍;

在【SSM开发慕课书评网】项目中的体现;(PS:并没有全部列举;可以参考【(17)SSM开发书评网】中的内容;)

          ● 【SSM开发书评网11:图书列表分页及查询一:显示图书类别;】:显示图书类别功能,因为其底层只需要执行一条SQL,而且其还是查询,所以可以不手动控制事务;

          ● 【SSM开发书评网12:图书列表分页及查询二:图书分页查询(1);】:图书分页查询功能,因为其底层只需要执行一条SQL,而且其还是查询,所以可以不手动控制事务;

          ● 【SSM开发书评网18:图书详情页开发二:显示评论列表;】:显示评论列表功能,因为其底层只需要执行一条SQL,而且其还是查询,所以可以不手动控制事务;

          ● 【SSM开发书评网21:完成会员注册功能;】:会员注册功能,需要增删改数据库,虽然增删改的语句其只有一个,但我们还是开启了手动控制事务;

          ● 【SSM开发书评网23:获取会员阅读状态;】;获取会员阅读状态功能,因为其底层只需要执行一条SQL,而且其还是查询,所以可以不手动控制事务;

          ● 【SSM开发书评网24:更新会员阅读状态;】;更新会员阅读状态功能,底层需要多条增删改语句,自然需要开启手动控制事务;

反正,基本情况就是如此,就不继续列举了;如有需要,可以去看看【(17)SSM开发书评网】中的内容;

在本专栏的【Spring Boot电商项目】中的体现;(PS:这儿并没有列举实例,如有需要在查看本专栏中的内容即可;)

(1)不需要我们手动控制事务的地方:(都是,增删改语句,不超过1个的情况)

          ● 对于这个项目来说,在【Spring Boot电商项目53:订单模块二:【前台:创建订单】接口;】之前的部分,也就是【用户模块】、【商品分类模块】、【商品模块】、【购物车模块】的所有接口来说,要实现这些功能,其底层要么没有增删改语句,要么只有一次;;所以,我们完全不需要去手动控制事务;

(2)需要我们手动控制事务的地方:(增删改语句超过1个的情况,都是需要手动去控制事务的)

          ●  在【Spring Boot电商项目53:订单模块二:【前台:创建订单】接口;】开发创建订单功能时候,要实现这个功能,在底层就需要有多个增删改的语句,为了保证业务要么全部成功要么什么也不错的要求,就需要我们手动控制事务;

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot中,你可以使用编程式的方式手动回滚事务。下面是一种常见的方式: ```java import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; import org.springframework.transaction.support.DefaultTransactionDefinition; @Service public class TransactionService { @Autowired private PlatformTransactionManager transactionManager; public void rollbackTransaction() { DefaultTransactionDefinition def = new DefaultTransactionDefinition(); def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); TransactionStatus status = transactionManager.getTransaction(def); try { // 执行你的业务逻辑 // ... // 如果发生异常,手动回滚事务 transactionManager.rollback(status); } catch (Exception e) { transactionManager.rollback(status); throw e; } } } ``` 在上面的代码中,我们首先通过`PlatformTransactionManager`注入事务管理器。然后,我们创建一个`DefaultTransactionDefinition`对象,并设置事务的传播行为为`PROPAGATION_REQUIRES_NEW`,这将创建一个新的事务。 接下来,在`try-catch`块中,执行你的业务逻辑。如果发生异常,我们调用`transactionManager.rollback(status)`来手动回滚事务。 请注意,在实际使用中,你需要根据你的业务逻辑和需求来确定事务的传播行为和异常处理方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值