当前位置:首页 > Java

如何控制事务 java

2026-03-22 00:40:31Java

使用 JDBC 事务控制

JDBC 默认自动提交事务,需通过 Connection 对象手动控制:

Connection conn = dataSource.getConnection();
try {
    conn.setAutoCommit(false); // 关闭自动提交
    Statement stmt = conn.createStatement();
    stmt.executeUpdate("INSERT INTO table1 VALUES (1)"); 
    stmt.executeUpdate("INSERT INTO table2 VALUES (2)");
    conn.commit(); // 提交事务
} catch (SQLException e) {
    conn.rollback(); // 回滚事务
} finally {
    conn.setAutoCommit(true); // 恢复自动提交
    conn.close();
}

使用 Spring 声明式事务

通过 @Transactional 注解简化事务管理,需在配置类启用事务:

@Configuration
@EnableTransactionManagement
public class AppConfig {
    @Bean
    public DataSource dataSource() {
        return new DriverManagerDataSource(url, user, password);
    }
    @Bean
    public PlatformTransactionManager txManager() {
        return new DataSourceTransactionManager(dataSource());
    }
}

@Service
public class UserService {
    @Transactional
    public void transferMoney() {
        // 数据库操作
    }
}

设置事务隔离级别

@Transactional 中指定隔离级别:

@Transactional(isolation = Isolation.READ_COMMITTED)
public void updateData() {
    // 操作代码
}

支持的值包括 DEFAULTREAD_UNCOMMITTEDREAD_COMMITTEDREPEATABLE_READSERIALIZABLE

设置事务传播行为

通过 propagation 属性控制事务传播方式:

如何控制事务 java

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void nestedOperation() {
    // 操作代码
}

常见选项:REQUIRED(默认)、REQUIRES_NEWSUPPORTSNOT_SUPPORTED 等。

回滚规则配置

指定异常类型触发回滚:

@Transactional(rollbackFor = {SQLException.class, CustomException.class})
public void process() throws CustomException {
    // 可能抛出异常的代码
}

默认仅对 RuntimeExceptionError 回滚,可通过 noRollbackFor 排除特定异常。

如何控制事务 java

编程式事务管理

使用 TransactionTemplate 显式控制事务:

@Autowired
private TransactionTemplate transactionTemplate;

public void executeWithTransaction() {
    transactionTemplate.execute(status -> {
        try {
            // 业务逻辑
            return result;
        } catch (Exception e) {
            status.setRollbackOnly();
            throw e;
        }
    });
}

分布式事务控制

通过 Spring 整合 JTA 或 Seata 实现跨数据源事务:

@Bean
public JtaTransactionManager jtaTransactionManager() {
    return new JtaTransactionManager();
}

@Transactional
public void distributedOperation() {
    // 跨库操作
}

需依赖如 Atomikos 或 Bitronix 等 JTA 实现。

注意事项

  • 确保事务方法内的异常不被捕获后忽略,否则回滚可能失效。
  • 避免在事务方法中调用同类其他方法,可能导致代理失效(自调用问题)。
  • 事务超时可通过 @Transactional(timeout = 10) 设置(单位:秒)。

标签: 事务java
分享给朋友:

相关文章

如何安装java环境

如何安装java环境

下载JDK安装包 访问Oracle官方网站或OpenJDK项目页面,选择适合操作系统的JDK版本(如Windows、macOS或Linux)。确保下载与系统架构匹配的版本(32位或64位)。 运行安…

java如何连接mysql

java如何连接mysql

连接 MySQL 数据库的基本步骤 添加 MySQL 驱动依赖 在项目中引入 MySQL 的 JDBC 驱动。如果使用 Maven,在 pom.xml 中添加以下依赖: <dependency…

java如何编写接口

java如何编写接口

编写Java接口的基本语法 在Java中,接口通过interface关键字定义,可以包含抽象方法、默认方法、静态方法和常量。 public interface MyInterface {…

如何成为java架构师

如何成为java架构师

掌握扎实的Java基础 深入理解Java核心知识,包括多线程、集合框架、JVM原理、设计模式等。熟悉Java生态中的常用框架如Spring、MyBatis、Hibernate等,并能分析其源码实现。…

如何启用java

如何启用java

启用 Java 的方法 检查 Java 是否已安装 在命令行或终端输入 java -version,如果显示版本信息,说明 Java 已安装。若未安装,需从 Oracle 官网 或 OpenJDK 下…

java实现vue接口

java实现vue接口

Java 实现 Vue 接口的方法 在 Java 中实现 Vue 前端调用的接口,通常需要使用 Spring Boot 框架构建 RESTful API。以下是具体的实现步骤和代码示例。 创建 Sp…