java如何保证事务
事务的基本概念
事务是数据库操作的基本单元,保证一组操作要么全部成功,要么全部失败。Java 中通常通过 JDBC 或框架(如 Spring)管理事务。
使用 JDBC 管理事务
JDBC 提供了原生的事务支持,通过 Connection 对象控制。
Connection connection = DriverManager.getConnection(url, username, password);
try {
connection.setAutoCommit(false); // 关闭自动提交,开启事务
// 执行 SQL 操作
Statement statement = connection.createStatement();
statement.executeUpdate("UPDATE account SET balance = balance - 100 WHERE id = 1");
statement.executeUpdate("UPDATE account SET balance = balance + 100 WHERE id = 2");
connection.commit(); // 提交事务
} catch (SQLException e) {
connection.rollback(); // 回滚事务
} finally {
connection.setAutoCommit(true); // 恢复自动提交
connection.close();
}
使用 Spring 声明式事务
Spring 通过 @Transactional 注解简化事务管理,适用于方法或类级别。

@Service
public class AccountService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Transactional
public void transfer(int fromId, int toId, int amount) {
jdbcTemplate.update("UPDATE account SET balance = balance - ? WHERE id = ?", amount, fromId);
jdbcTemplate.update("UPDATE account SET balance = balance + ? WHERE id = ?", amount, toId);
}
}
事务隔离级别
通过 @Transactional 的 isolation 属性设置隔离级别,解决脏读、不可重复读、幻读等问题。
@Transactional(isolation = Isolation.READ_COMMITTED)
public void updateData() {
// 业务逻辑
}
事务传播行为
定义多个事务方法调用时的行为,例如 REQUIRED(默认,加入当前事务)或 REQUIRES_NEW(新建事务)。

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void logOperation() {
// 记录日志,独立事务
}
手动回滚事务
在 Spring 中可通过 TransactionAspectSupport 手动触发回滚。
@Transactional
public void process() {
try {
// 业务逻辑
} catch (Exception e) {
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
分布式事务
对于跨数据库或微服务场景,可使用 Seata、Spring Cloud Alibaba 等框架实现分布式事务。
@GlobalTransactional
public void distributedOperation() {
// 调用多个微服务
}
最佳实践
- 避免长事务,减少锁竞争。
- 合理设置隔离级别,平衡性能与一致性。
- 在异常处理中明确回滚条件,避免部分提交。
- 测试事务边界,确保异常场景正确处理。






