Spring的事务处理
1. 什么是事务
事务是保证业务操作完整性的一种数据库机制。
事务的四大特性:
- A:原子性
- C:一致性
- I:隔离性
- D:持久性
2. 如何控制事务
- JDBC:
- Connection.setAutoCommit(false);
- Connection.commit();
- Connection.rollback();
- Mybatis:
- Mybatis⾃动开启事务
- sqlSession(Connection).commit();
- sqlSession(Connection).rollback();
结论:控制事务的底层 都是Connection对象完成的。
3. Spring控制事务的开发
Spring采用AOP开发的方式来实现事务控制。
所以需要以下几个基本步骤:
- 提供原始对象
- 提供额外功能(Spring对其进行了封装)
- 配置切入点(使用
@Transactional注解
) - 组装切面(修改配置文件)
3.1 引入事务相关依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.1.14.RELEASE</version>
</dependency>
3.2 编码
-
UserServiceImpl: 标记
@Transaction
注解@Transaction public class UserServiceImpl implements UserService { private UserDAO userDAO; public UserDAO getUserDAO() { return userDAO; } public void setUserDAO(UserDAO userDAO) { this.userDAO = userDAO; } @Override public void register(User user) { userDAO.save(user); } }
-
在Spring配置文件中添加信息
<bean id="userService" class="com.jc.service.impl.UserServiceImpl"> <property name="userDAO" ref="userDAO"/> </bean> <!--DataSourceTransactionManager--> <bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
3.3 细节分析
-
实际增添额外功能也就是事务功能的是
DataSourceTransactionManager
,所以要使用事务就需要在Spring配置文件中对其进行配置。 -
实现事务实际上就是动态代理,所以可以切换动态代理的实现方式(JDK或者CGlib)
默认为JDK动态代理,可以不设置proxy-target-class属性 <tx:annotation-driven transaction-manager="dataSourceTransactionManager" proxy-target-class="false"/> 修改为CGlib <tx:annotation-driven transaction-manager="dataSourceTransactionManager" proxy-target-class="true"/>