Java事务的基本概念
在Java开发中,事务是一组操作的集合,这些操作要么全部成功执行,要么全部回滚到初始状态,确保数据的一致性和完整性,事务通常遵循ACID特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),Java中管理事务的方式主要有两种:编程式事务管理和声明式事务管理。

编程式事务管理
编程式事务管理通过代码显式控制事务的提交和回滚,灵活性较高,但代码侵入性强,在Spring框架中,可以通过TransactionTemplate或PlatformTransactionManager实现。
@Autowired
private PlatformTransactionManager transactionManager;
public void performTransaction() {
TransactionDefinition def = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(def);
try {
// 执行数据库操作
transactionManager.commit(status);
} catch (Exception e) {
transactionManager.rollback(status);
throw e;
}
}
上述代码中,transactionManager负责开启事务、提交或回滚,编程式事务适用于需要精细控制事务边界的场景,但手动管理事务代码较为繁琐。
声明式事务管理
声明式事务管理通过注解或XML配置管理事务,代码侵入性低,更符合开闭原则,Spring框架提供了@Transactional注解,简化事务管理。
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Transactional
public void createOrder(Order order) {
orderMapper.insertOrder(order);
// 其他业务逻辑
}
}
使用@Transactional时,需确保事务管理器(如DataSourceTransactionManager)已配置,且注解所在的类和方法由Spring代理(如通过@Service、@Component等注解),声明式事务是Spring中最常用的事务管理方式,适用于大多数业务场景。

事务的传播行为
事务传播行为定义了多个事务方法相互调用时,事务如何传播,Spring中常用的事务传播行为包括:
- REQUIRED(默认):如果当前存在事务,则加入该事务;否则新建一个事务。
- REQUIRES_NEW:新建一个事务,如果当前存在事务,则挂起当前事务。
- SUPPORTS:如果当前存在事务,则加入该事务;否则以非事务方式执行。
- MANDATORY:必须在一个事务中执行,否则抛出异常。
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateOrderStatus(Long orderId) {
// 更新订单状态
}
合理设置传播行为可以避免事务嵌套导致的问题,如数据不一致。
事务的隔离级别
事务隔离级别决定了事务之间的可见性,防止并发问题,Spring中支持的隔离级别包括:
- DEFAULT:使用数据库默认隔离级别。
- READ_UNCOMMITTED:读取未提交的数据,可能出现脏读。
- READ_COMMITTED:读取已提交的数据,避免脏读。
- REPEATABLE_READ:可重复读,避免脏读和不可重复读。
- SERIALIZABLE:最高隔离级别,事务串行执行,避免所有并发问题。
@Transactional(isolation = Isolation.READ_COMMITTED)
public void queryUser(Long userId) {
// 查询用户信息
}
根据业务需求选择合适的隔离级别,平衡性能和数据一致性。

事务的注意事项
- 异常处理:默认情况下,只有运行时异常(
RuntimeException)或错误会导致事务回滚,受检异常不会触发回滚,可通过@Transactional(noRollbackFor = Exception.class)配置。 - 事务边界:事务方法应尽量简短,避免包含耗时操作(如远程调用、文件IO),减少事务持有数据库连接的时间。
- 自调用问题:Spring基于代理管理事务,类内部方法调用可能导致事务失效,可通过注入自身代理或调整方法结构解决。
通过合理使用Java事务管理机制,可以有效保障数据的完整性和一致性,提升系统的可靠性,在实际开发中,应根据业务场景选择合适的事务管理方式和配置参数。

















