- 什么是事务?
java
保证业务操作完整性的一种数据库机制
事务的4大特点:A C I D
1. A 原子性
2. C 一致性
3. I 隔离性
4. D 持久性
- 如何控制事务
java
JDBC:
Connection.setAutoCommit(false);
Connection.commit();
Connection.rollback();
MyBatis:
MyBatis自动开启事务
sqlSession(Connection).commit();
sqlSession(Connection).rollback();
结论:控制事务的底层,都是Connection对象完成的
- Spring控制事务的开发
java
Spring是通过AOP的方式进行事务开发
(1)原始对象
java
public class XXXUserServiceImpl{
private xxxDAO xxxDAO;
set get
1. 原始对象 ---》 原始方法 ---》 核心功能(业务处理+DAO调用)
2. DAO作为Service的成员变量,依赖注入的方式进行赋值
}
(2)额外功能
java
1. org.springframework.jdbc.datasource.DataSourceTranscationManager
2. 注入DataSource
# 事务底层实现两种方式
1. MethodInterceptor
public Object invoke(MethodInvocation invocation){
try{
Connection.setAutoCommit(false);
Object ret = invocation.proceed();
Connection.commit();
}catch(){
Connection.rollback();
}
return ret;
}
2. @Aspect
@Around
(3)切入点
java
@Transactional
事务的额外功能加入给那些业务方法
1. 类上:类中所有的方法都会加入事务
2. 方法上:这个方法会加入事务
(4)组装切面
java
1. 切入点
2. 额外功能
<tx:annotation-driven transaction-manager=""/>
- Spring控制事务的编码
(1)搭建开发环境
java
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.1.14.RELEASE</version>
</dependency>
(2)编码
java
# 原始对象
<bean id="userService" class="com.baizhiedu.service.UserServiceImpl">
<property name="userDAO" ref="userDAO"/>
</bean>
# 额外功能(事务)
<bean id="dataSourceTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTranscationManager">
<property name="dataSource" ref="dataSource"/>
</bean>
# 切入点
@Transcational
public class UserServiceImpl implements UserService {
private UserDAO userDAO;
}
# 组装切面
<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
(3)细节
java
<tx:annotation-driven transaction-manager="dataSourceTransactionManager" proxy-target-class="true"/>
进行动态代理底层实现的切换 proxy-target-class
默认:false JDK动态代理
true CGLIB动态代理