java如何实现事务
Java 事务实现方法
在 Java 中,事务管理可以通过多种方式实现,主要包括 JDBC 原生事务、Spring 声明式事务和 JTA 分布式事务。以下是具体实现方式:
JDBC 原生事务
JDBC 提供了基本的事务管理功能,适用于简单的数据库操作场景。通过 Connection 对象控制事务的提交和回滚。
Connection conn = null;
try {
conn = dataSource.getConnection();
conn.setAutoCommit(false); // 关闭自动提交
// 执行SQL操作
Statement stmt = conn.createStatement();
stmt.executeUpdate("UPDATE account SET balance = balance - 100 WHERE id = 1");
stmt.executeUpdate("UPDATE account SET balance = balance + 100 WHERE id = 2");
conn.commit(); // 提交事务
} catch (SQLException e) {
if (conn != null) {
conn.rollback(); // 回滚事务
}
} finally {
if (conn != null) {
conn.close();
}
}
Spring 声明式事务
Spring 框架提供了声明式事务管理,通过注解或 XML 配置简化事务管理。推荐使用 @Transactional 注解。
@Service
public class AccountService {
@Autowired
private AccountDao accountDao;
@Transactional
public void transferMoney(Long fromId, Long toId, double amount) {
accountDao.debit(fromId, amount);
accountDao.credit(toId, amount);
}
}
在 Spring Boot 中,需添加以下依赖并启用事务管理:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
JTA 分布式事务
对于跨多个数据库或消息队列的分布式事务,可以使用 Java Transaction API (JTA)。常见的实现有 Atomikos 和 Narayana。

@Transactional
public void distributedOperation() {
jdbcTemplate.update("UPDATE db1.account SET balance = balance - 100 WHERE id = 1");
jmsTemplate.convertAndSend("queue", new Message("Transfer 100"));
}
配置 JTA 事务管理器(以 Atomikos 为例):
@Bean
public JtaTransactionManager transactionManager() {
UserTransactionManager userTransactionManager = new UserTransactionManager();
UserTransaction userTransaction = new UserTransactionImp();
return new JtaTransactionManager(userTransaction, userTransactionManager);
}
事务隔离级别与传播行为
在 Spring 中可以通过 @Transactional 注解配置事务属性:
@Transactional(
isolation = Isolation.READ_COMMITTED,
propagation = Propagation.REQUIRED,
timeout = 30,
rollbackFor = Exception.class
)
public void businessMethod() {
// 业务逻辑
}
常用隔离级别:

READ_UNCOMMITTED:读未提交READ_COMMITTED:读已提交(默认)REPEATABLE_READ:可重复读SERIALIZABLE:串行化
常用传播行为:
REQUIRED:支持当前事务,不存在则新建(默认)REQUIRES_NEW:新建事务,挂起当前事务NESTED:嵌套事务
注意事项
事务方法应避免自调用,即同一个类中的方法相互调用会导致事务失效。可通过将事务方法拆分到不同类中解决。
长事务会影响系统性能,应尽量减小事务范围和执行时间。对于批量操作,可考虑分批次提交。
分布式事务性能开销较大,应优先考虑最终一致性方案而非强一致性。






