likes
comments
collection
share

Spring5深入浅出篇:Spring中的事务

作者站长头像
站长
· 阅读数 4

Spring5深入浅出篇:Spring中的事务

什么是事务

保证业务操作完整性的⼀种数据库机制
事务的4特点: A C I D
1. A 原⼦性
2. C ⼀致性
3. I 隔离性
4. D 持久性

如何控制事务

从最开始的JDBC然后是mybatis最后在是今天我们了解的Spring中的事务

JDBC:
 Connection.setAutoCommit(false);
 Connection.commit();
 Connection.rollback();

JDBC的方式通过Connection控制事务的提交和回滚

Mybatis:
 Mybatis⾃动开启事务
 
 sqlSession(Connection).commit();
 sqlSession(Connection).rollback();

结论:控制事务的底层 都是Connection对象完成的。

在这里可以发现mybatis其实是通过sqlSession去进行事务的提交和回滚,但是其内部本质还是通过Connection这个对象来进行操作的,对照JDBC来看可以发现Connection对象使我们进行事务处理的核心对象,Spring处理事务也跟它息息相关.

Spring控制事务的开发

Spring是通过AOP的⽅式进⾏事务开发,那么一定离不开我们之前说的动态代理开发的四个步骤.(原始对象,额外功能,切入点,组装切面)接下来我们就通过这四部来进行分析即可

原始对象

public class XXXUserServiceImpl{
 private xxxDAO xxxDAO
 set get
 1. 原始对象 ---》 原始⽅法 ---》核⼼功能 (业务处理+DAO调⽤)
 2. DAO作为Service的成员变量,依赖注⼊的⽅式进⾏赋值
}

原始对象肯定是代码中某个业务层的代码我们来进行事务管理,然后会有成员变量也就是DAO相关操作数据的业务这里我们才需要对操作进行事务管理

额外功能

之前我们进行Spring动态代理开发是通过MethodInterceptor中的invoke方法进行额外功能的添加即可,那么这里我们也一样

 MethodInterceptor的方式
 public Object invoke(MethodInvocation invocation){
 try{
 Connection.setAutoCommit(false);
 Object ret = invocation.proceed();
 Connection.commit();
 }catch(Exception e){
 Connection.rollback();
 }
 return ret;
 }

我们在方法执行之前去开启事务,然后在处理完原始对象后进行事务提交.但是这段代码人人都会写,而且比较繁琐.所以我们只需要使用Spring给我提供的对象即可,然后我们还需要Connection对象进行事务管理操作,然后去注入DataSource去获取Connection对象

1. org.springframework.jdbc.datasource.DataSourceTransactionManager
2. 注⼊DataSource

最后一个小细节,在这里我们也可以不通过 MethodInterceptor的方式,直接使用之前AOP中的注解完成这事务管理的操作 @Aspect @Around

切入点

@Transactional
事务的额外功能加⼊给那些业务⽅法。
1. 类上:类中所有的⽅法都会加⼊事务
2. ⽅法上:这个⽅法会加⼊事务

@Transactional这个是Spring提供的注解,可以加到类上和方法上.注解加在类上会将类中的所有方法都加入事务,在方法上只会将当前方法加入事务.通过这个注解我们就可以很清楚的知道需要将事务加入到哪些业务方法中

组装切⾯

1. 切⼊点
2. 额外功能
<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>

添加这个tx包下的标签即可开启Spring对事务的控制

Spring控制事务的编码

  • 搭建开发环境 引入pom.xml依赖

这里我就不多写其他依赖了,只标注需要Spring支持事务的依赖

<dependency>
 <groupId>org.springframework</groupId>
 <artifactId>spring-tx</artifactId>
 <version>5.1.14.RELEASE</version>
</dependency>
  • 在ApplicationContext.xml中将所需要的bean对象进行配置
<bean id="userService" class="com.baizhiedu.service.UserServiceImpl">
 <property name="userDAO" ref="userDAO"/>
</bean>
<!--DataSourceTransactionManager-->
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
 <property name="dataSource" ref="dataSource"/>
</bean>

这里需要把配置对象中的属性值也对应注入

  • 在对应业务类或者方法上增加注解@Transactional让事务生效
@Transactional
public class UserServiceImpl implements UserService {
 private UserDAO userDAO;
  • 在ApplicationContext.xml中开启Spring对事务的支持,并且指定对应的事务管理器
<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
  • 最后一个小细节,可以通过proxy-target-class 属性值来切换动态代理的方式为JDK还是CGLIB
<tx:annotation-driven transactionmanager="dataSourceTransactionManager" proxy-target-class="true"/>
进⾏动态代理底层实现的切换 proxy-target-class
 默认 false JDK
 true Cglib

以上便是本文的全部内容,我是全干程序员demo,每天为你带来最新好用的开发运维工具,如果你觉得用,请点赞,让更多的人了解相关工具

如果你想了解更多关于全干程序员demo,还有更多付费工具免费破解如JB全家桶,可以关注公众号-全干程序员demo,后面文章会首先同步至公众号