如何控制事务 java
使用 JDBC 事务控制
JDBC 默认自动提交事务,需通过 Connection 对象手动控制:
Connection conn = dataSource.getConnection();
try {
conn.setAutoCommit(false); // 关闭自动提交
Statement stmt = conn.createStatement();
stmt.executeUpdate("INSERT INTO table1 VALUES (1)");
stmt.executeUpdate("INSERT INTO table2 VALUES (2)");
conn.commit(); // 提交事务
} catch (SQLException e) {
conn.rollback(); // 回滚事务
} finally {
conn.setAutoCommit(true); // 恢复自动提交
conn.close();
}
使用 Spring 声明式事务
通过 @Transactional 注解简化事务管理,需在配置类启用事务:
@Configuration
@EnableTransactionManagement
public class AppConfig {
@Bean
public DataSource dataSource() {
return new DriverManagerDataSource(url, user, password);
}
@Bean
public PlatformTransactionManager txManager() {
return new DataSourceTransactionManager(dataSource());
}
}
@Service
public class UserService {
@Transactional
public void transferMoney() {
// 数据库操作
}
}
设置事务隔离级别
在 @Transactional 中指定隔离级别:
@Transactional(isolation = Isolation.READ_COMMITTED)
public void updateData() {
// 操作代码
}
支持的值包括 DEFAULT、READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ 和 SERIALIZABLE。
设置事务传播行为
通过 propagation 属性控制事务传播方式:

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void nestedOperation() {
// 操作代码
}
常见选项:REQUIRED(默认)、REQUIRES_NEW、SUPPORTS、NOT_SUPPORTED 等。
回滚规则配置
指定异常类型触发回滚:
@Transactional(rollbackFor = {SQLException.class, CustomException.class})
public void process() throws CustomException {
// 可能抛出异常的代码
}
默认仅对 RuntimeException 和 Error 回滚,可通过 noRollbackFor 排除特定异常。

编程式事务管理
使用 TransactionTemplate 显式控制事务:
@Autowired
private TransactionTemplate transactionTemplate;
public void executeWithTransaction() {
transactionTemplate.execute(status -> {
try {
// 业务逻辑
return result;
} catch (Exception e) {
status.setRollbackOnly();
throw e;
}
});
}
分布式事务控制
通过 Spring 整合 JTA 或 Seata 实现跨数据源事务:
@Bean
public JtaTransactionManager jtaTransactionManager() {
return new JtaTransactionManager();
}
@Transactional
public void distributedOperation() {
// 跨库操作
}
需依赖如 Atomikos 或 Bitronix 等 JTA 实现。
注意事项
- 确保事务方法内的异常不被捕获后忽略,否则回滚可能失效。
- 避免在事务方法中调用同类其他方法,可能导致代理失效(自调用问题)。
- 事务超时可通过
@Transactional(timeout = 10)设置(单位:秒)。






