一、 事务管理实现原理
Spring事务管理的核心是PlatformTransactionManager
接口,它定义了事务管理的基本操作。Spring提供了多种实现,如DataSourceTransactionManager
(用于JDBC)和JpaTransactionManager
(用于JPA)。
编程式事务管理:直接在代码中使用TransactionTemplate
或PlatformTransactionManager
来控制事务的边界。
声明式事务管理:使用注解(如@Transactional
)或XML配置来声明方法的事务行为。Spring AOP(面向切面编程)在运行时处理这些声明,并确保方法按照指定的事务属性执行。
二、相关Spring源码分析
当你在方法上使用@Transactional
注解时,Spring会在运行时为该方法创建一个代理,这个代理会负责管理事务的开始、提交和回滚。
核心类和接口:
PlatformTransactionManager
:事务管理器接口。TransactionInterceptor
:AOP拦截器,捕获@Transactional
注解的方法。TransactionAspectSupport
:为事务方法提供支持,包括创建、提交和回滚事务。
三、 使用场景
- 数据库操作:当需要确保一系列的数据库操作作为一个单一的事务执行时。
- 外部系统集成:确保与外部系统的交互在事务中正确处理。
- 批处理:确保批处理任务的每个步骤都在其自己的事务中执行。
四、具体使用场景实现代码
声明式事务管理:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Transactional
public void createUser(User user) {
userRepository.save(user);
// 如果此处发生异常,事务会自动回滚
if (user.getName().equals("test")) {
throw new RuntimeException("Test exception");
}
}
}
编程式事务管理:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Autowired
private PlatformTransactionManager transactionManager;
public void createUser(User user) {
TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
userRepository.save(user);
if (user.getName().equals("test")) {
status.setRollbackOnly(); // 设置事务回滚
}
}
});
}
}