SpringTX的介绍
问题:
我们可以直接从Spring容器中获取mapper层的实例化对象完成数据库操作。而在业务层方法中很多时候因为业务逻辑的复杂性,会出现在业务层方法中调用多个数据库操作。而之前我们学习过事务的管理,在同一个业务中只要有一个数据库操作执行失败,其他的就算执行成功也会一并回滚。但是在Spring整合Mybatis后,我们获取的直接是Mapper接口的实例化对象,而事务的管理需要使用connection对象来完成或者SqlSession对象来完成,那么在Spring整合Mybatis后如何声明事务管理代码呢?
解决:
假如我们能够从Spring容器中获取SqlSession对象,那么在业务方法A中调用了多次的数据库操作,我们就需要在A业务方法中的业务逻辑代码之前开启事务管理,在逻辑代码之后进行提交或者回滚。假如有10个业务方法需要声明事务管理,则需要声明10次,过于麻烦,而且需要修改业务方法的源码。基于以上的流程我们发现,该扩展流程完全符合AOP的基本规范,考虑使用SpringAOP的方式来对业务方法进行扩展,声明环绕通知,在环绕通知中声明事务管理代码,切点为要进行事务管理的业务方法。
但是我们又无法直接获取到SqlSession对象,造成无法在环绕通 知中声明事务管理代码,又发现事务管理的代码是重复的代码, 那么能不能让Spring官方给我们直接提供一个和Spring容器直 接整合好的事务管理类。答案是可以的。
理论图:
实现:
Spring的TX
概念:
编程式事务:
事务管理代码由自己编写。
声明式事务:
事务管理代码由第三方直接提供,直接将其组装 到功能中即 可。