当前位置:首页 > Java

java事物如何使用

2026-03-22 22:02:09Java

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_COMMITTEDSERIALIZABLE
  • 传播行为:定义事务如何嵌套,如 REQUIREDREQUIRES_NEW

在 Spring 中配置:

java事物如何使用

@Transactional(isolation = Isolation.READ_COMMITTED, propagation = Propagation.REQUIRED)
public void someMethod() {
    // 业务逻辑
}

事务的注意事项

  • 避免长事务,减少锁竞争。
  • 确保异常能触发回滚,默认仅回滚 RuntimeExceptionError
  • 在分布式系统中,考虑使用分布式事务框架(如 Seata)。

分享给朋友:

相关文章

react filter如何使用

react filter如何使用

react filter 的基本用法 在 React 中,filter 通常用于筛选数组数据,常见于列表渲染或数据处理场景。filter 是 JavaScript 数组的原生方法,但在 React 中…

react如何使用echarts

react如何使用echarts

安装 ECharts 和 React 适配库 在 React 项目中使用 ECharts 需要安装 ECharts 核心库及其 React 适配库。通过 npm 或 yarn 安装: npm ins…

react如何使用图片

react如何使用图片

在React中使用图片的方法 静态图片导入 在React组件中可以直接通过import导入图片文件,这种方式适用于已知的静态资源。导入后,图片会被处理为模块,可通过src属性引用。 import R…

react 如何使用fiber

react 如何使用fiber

使用 React Fiber 的方法 React Fiber 是 React 16 引入的重新实现的协调算法,用于优化渲染性能。以下是使用 Fiber 的方法。 理解 React Fiber 的核心…

react如何使用组件

react如何使用组件

使用组件的基本方法 在React中,组件是构建用户界面的核心单元。组件分为函数组件和类组件两种形式。 函数组件示例 function Greeting(props) { return <…

web项目如何使用react

web项目如何使用react

使用 React 构建 Web 项目的关键步骤 环境准备 安装 Node.js 和 npm(或 yarn),确保开发环境支持现代 JavaScript。通过以下命令创建 React 项目: np…