一、事务基础概念
1.1 什么是事务?
事务(Transaction)是数据库操作的最小工作单元,具有ACID四大特性:
原子性(Atomicity):事务中的操作要么全部成功,要么全部失败
一致性(Consistency):事务执行前后数据库状态保持一致
隔离性(Isolation):并发事务之间相互隔离
持久性(Durability):事务提交后数据永久保存
说白了就是一组操作的集合,要么一起被执行,要么都不执行,保证数据的一致
1.2 Spring事务管理
Spring通过统一的事务抽象层,提供两种管理方式:
编程式事务:通过TransactionTemplate手动控制
声明式事务:通过@Transactional注解自动管理(推荐方式)
二、事务核心操作流程
三、Spring事务实战
3.1 基础配置
@Configuration
@EnableTransactionManagement
public class AppConfig {
@Bean
public DataSource dataSource() {
return new DriverManagerDataSource(...);
}
@Bean
public PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
}
3.2 转账案例实现
public interface BankService {
void transfer(String from, String to, BigDecimal amount);
}
@Service
public class BankServiceImpl implements BankService {
@Autowired
private AccountDao accountDao;
@Transactional
@Override
public void transfer(String from, String to, BigDecimal amount) {
accountDao.debit(from, amount); // 转出
accountDao.credit(to, amount); // 转入
}
}
3.3 事务回滚示例
@Transactional(rollbackFor = {BusinessException.class})
public void processOrder(Order order) throws BusinessException {
try {
inventoryService.reduceStock(order);
paymentService.processPayment(order);
} catch (InsufficientStockException ex) {
throw new BusinessException("库存不足", ex); // 触发回滚
}
}
四、@Transactional注解深度解析
4.1 核心属性详解
(1)propagation:事务传播机制
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void auditLog(String message) {
// 始终新建事务执行
}
(2)isolation:隔离级别
@Transactional(isolation = Isolation.REPEATABLE_READ)
public void financialReport() {
// 保证同一事务中多次读取结果一致
}
(3)timeout:超时控制
@Transactional(timeout = 30) // 单位:秒
public void batchProcess() {
// 超时自动回滚
}
(4)readOnly:只读优化
@Transactional(readOnly = true)
public List<Report> generateReport() {
// 启用只读模式优化
}
(5)rollback规则
@Transactional(
rollbackFor = {BusinessException.class},
noRollbackFor = {SystemErrorException.class}
)
public void businessOperation() {
// 自定义回滚规则
}
4.2 方法可见性与事务生效
public class OrderService {
// 生效:public方法
@Transactional
public void publicMethod() {}
// 不生效:非public方法
@Transactional
private void privateMethod() {}
// 自调用不生效!
public void outerMethod() {
innerMethod(); // 事务注解失效
}
@Transactional
public void innerMethod() {}
}
五、事务失效的常见陷阱
-
异常类型不匹配
-
默认只回滚RuntimeException和Error
-
解决方案:配置
rollbackFor
-
-
数据库引擎不支持
-
MyISAM引擎不支持事务
-
必须使用InnoDB引擎
-
-
同类方法自调用
-
通过AOP代理调用才能生效
-
解决方案:使用AopContext.currentProxy()
-
-
多数据源未指定
-
当存在多个TransactionManager时需指定:
-
@Transactional("orderTransactionManager")
总结
Spring事务管理通过@Transactional注解实现了声明式事务的优雅封装。正确配置传播机制和隔离级别可以帮助我们有效处理并发问题,而合理的超时与只读设置则能显著提升系统性能。理解事务的底层原理,结合业务场景选择合适的配置方案,是构建高可靠分布式系统的关键。