当前位置:首页 > 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)。

分享给朋友:

相关文章

uniapp中如何使用iconfont

uniapp中如何使用iconfont

使用 Iconfont 在 Uniapp 中的步骤 下载 Iconfont 资源 访问 Iconfont 官网,选择需要的图标并添加到项目。下载时选择 Font class 格式,解压后会得到 .tt…

react如何使用webview

react如何使用webview

使用 React 实现 WebView 的方法 在 React 中,可以通过不同的方式实现 WebView 功能,具体取决于开发环境(如 React Native 或 Web 应用)。以下是常见的实现…

react router如何使用

react router如何使用

React Router 的基本使用 安装 React Router 库,使用 npm 或 yarn 进行安装: npm install react-router-dom 配置路由 在应用的入口文件…

react 如何使用axios

react 如何使用axios

安装 axios 在 React 项目中安装 axios 依赖包: npm install axios # 或 yarn add axios 引入 axios 在需要发送 HTTP 请求的组件或文件…

react如何使用link

react如何使用link

使用 Link 组件进行页面导航 在 React 中,Link 是 react-router-dom 提供的组件,用于在单页应用(SPA)中实现客户端路由导航,避免页面刷新。 安装 react-…

react dnd如何使用

react dnd如何使用

React DnD 使用指南 React DnD(Drag and Drop)是一个用于在 React 应用中实现拖放功能的库。它基于 HTML5 的拖放 API,提供了更高级的抽象和更好的 Reac…