java事物如何使用
Java 事务的基本概念
事务是数据库操作的基本单元,确保一组操作要么全部成功,要么全部失败。Java 中主要通过 JDBC、JPA(Hibernate)或 Spring 框架管理事务。
使用 JDBC 实现事务
JDBC 提供了原生的事务支持,通过 Connection 对象控制事务的提交和回滚。
Connection connection = null;
try {
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password");
connection.setAutoCommit(false); // 关闭自动提交,开启事务
Statement stmt = connection.createStatement();
stmt.executeUpdate("INSERT INTO users (name) VALUES ('Alice')");
stmt.executeUpdate("INSERT INTO orders (user_id, amount) VALUES (1, 100)");
connection.commit(); // 提交事务
} catch (SQLException e) {
if (connection != null) {
connection.rollback(); // 回滚事务
}
e.printStackTrace();
} finally {
if (connection != null) {
connection.setAutoCommit(true); // 恢复自动提交
connection.close();
}
}
使用 Spring 声明式事务
Spring 提供了 @Transactional 注解,简化事务管理。
确保 Spring 配置中启用事务管理:
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
在 Service 层使用 @Transactional:
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional
public void createUserWithOrder(String username, double amount) {
User user = new User(username);
userRepository.save(user);
Order order = new Order(user.getId(), amount);
orderRepository.save(order);
}
}
使用 JPA/Hibernate 事务
JPA 通过 EntityManager 管理事务,通常与 Spring 结合使用。
手动管理事务:
EntityManager em = entityManagerFactory.createEntityManager();
EntityTransaction tx = em.getTransaction();
try {
tx.begin();
em.persist(new User("Bob"));
em.persist(new Order(1, 200));
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
结合 Spring 的 @Transactional:
@Repository
public class UserRepository {
@PersistenceContext
private EntityManager em;
@Transactional
public void saveUser(User user) {
em.persist(user);
}
}
事务的隔离级别和传播行为
- 隔离级别:控制事务之间的可见性,如
READ_COMMITTED、SERIALIZABLE。 - 传播行为:定义事务如何嵌套,如
REQUIRED、REQUIRES_NEW。
在 Spring 中配置:

@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)
public void someMethod() {
// 业务逻辑
}
事务的注意事项
- 避免长事务,减少锁竞争。
- 确保异常能触发回滚,默认仅回滚
RuntimeException和Error。 - 在分布式系统中,考虑使用分布式事务框架(如 Seata)。





