java事务如何实现
Java事务的实现方式
Java中事务的实现可以通过多种方式,主要包括JDBC原生事务、Spring框架的事务管理以及JTA(Java Transaction API)等。以下是常见的实现方法:
JDBC原生事务
JDBC提供了基本的事务支持,通过Connection对象控制事务的提交和回滚。示例代码如下:
Connection conn = null;
try {
conn = dataSource.getConnection();
conn.setAutoCommit(false); // 开启事务
// 执行SQL操作
Statement stmt = conn.createStatement();
stmt.executeUpdate("INSERT INTO table1 VALUES (...)");
stmt.executeUpdate("UPDATE table2 SET ...");
conn.commit(); // 提交事务
} catch (SQLException e) {
if (conn != null) {
conn.rollback(); // 回滚事务
}
} finally {
if (conn != null) {
conn.setAutoCommit(true); // 恢复自动提交
conn.close();
}
}
Spring声明式事务
Spring框架通过@Transactional注解简化事务管理,支持XML配置和注解方式。示例:
@Service
public class UserService {
@Autowired
private UserDao userDao;
@Transactional
public void updateUser(User user) {
userDao.update(user);
}
}
配置Spring事务管理器(以JDBC为例):
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
Spring编程式事务
通过TransactionTemplate或PlatformTransactionManager手动控制事务:
@Autowired
private TransactionTemplate transactionTemplate;
public void doInTransaction() {
transactionTemplate.execute(status -> {
// 业务逻辑
userDao.update(user1);
userDao.update(user2);
return null;
});
}
JTA分布式事务
适用于跨多个资源(如数据库、消息队列)的分布式事务,需应用服务器支持(如WebLogic、WildFly):
@Resource
private UserTransaction userTransaction;
public void distributedTransaction() throws Exception {
userTransaction.begin();
try {
// 操作多个数据源
ds1.executeUpdate(...);
ds2.executeUpdate(...);
userTransaction.commit();
} catch (Exception e) {
userTransaction.rollback();
}
}
事务传播行为
Spring定义了七种事务传播行为,通过@Transactional(propagation=Propagation.REQUIRED)指定:
REQUIRED:默认值,当前存在事务则加入,否则新建REQUIRES_NEW:总是新建事务SUPPORTS:当前存在事务则加入,否则非事务运行NOT_SUPPORTED:非事务方式执行MANDATORY:必须在事务中运行,否则抛出异常NEVER:必须在非事务中运行,否则抛出异常NESTED:嵌套事务执行
事务隔离级别
通过@Transactional(isolation=Isolation.READ_COMMITTED)设置隔离级别:

DEFAULT:使用数据库默认级别READ_UNCOMMITTED:读未提交READ_COMMITTED:读已提交REPEATABLE_READ:可重复读SERIALIZABLE:串行化
注意事项
- 确保事务方法内的异常能被正确捕获,默认只回滚RuntimeException和Error
- 避免在事务方法中处理耗时操作,减少锁持有时间
- 分布式事务需要考虑性能开销和失败处理机制
- 使用
@Transactional时,代理对象调用才生效,同类方法调用会失效






