java如何实现事务
事务的基本概念
事务是数据库操作的最小单元,具备ACID特性(原子性、一致性、隔离性、持久性)。Java中通常通过JDBC或框架(如Spring)实现事务管理。
JDBC原生事务实现
通过Connection对象控制事务,需手动管理提交和回滚:
Connection conn = null;
try {
conn = dataSource.getConnection();
conn.setAutoCommit(false); // 关闭自动提交
// 执行SQL操作
PreparedStatement stmt1 = conn.prepareStatement("UPDATE account SET balance = balance - 100 WHERE id = 1");
stmt1.executeUpdate();
PreparedStatement stmt2 = conn.prepareStatement("UPDATE account SET balance = balance + 100 WHERE id = 2");
stmt2.executeUpdate();
conn.commit(); // 提交事务
} catch (SQLException e) {
if (conn != null) conn.rollback(); // 回滚事务
} finally {
if (conn != null) conn.close();
}
Spring声明式事务
通过注解@Transactional简化事务管理,需配置事务管理器:

@Configuration
@EnableTransactionManagement
public class AppConfig {
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
@Service
public class AccountService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Transactional
public void transfer() {
jdbcTemplate.update("UPDATE account SET balance = balance - 100 WHERE id = 1");
jdbcTemplate.update("UPDATE account SET balance = balance + 100 WHERE id = 2");
}
}
Spring编程式事务
通过TransactionTemplate手动控制事务边界:
@Service
public class AccountService {
@Autowired
private TransactionTemplate transactionTemplate;
public void transfer() {
transactionTemplate.execute(status -> {
jdbcTemplate.update("UPDATE account SET balance = balance - 100 WHERE id = 1");
jdbcTemplate.update("UPDATE account SET balance = balance + 100 WHERE id = 2");
return null;
});
}
}
JTA分布式事务
适用于跨多数据源或微服务场景,需依赖JTA实现(如Atomikos):

@Bean
public JtaTransactionManager transactionManager() {
return new JtaTransactionManager();
}
@Transactional
public void distributedOperation() {
// 操作多个数据源或服务
}
事务隔离级别配置
通过@Transactional的isolation属性指定:
@Transactional(isolation = Isolation.READ_COMMITTED)
public void updateData() {
// 业务逻辑
}
事务传播行为
定义方法间事务如何传递,常用Propagation.REQUIRED(默认):
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void innerMethod() {
// 始终开启新事务
}






