当前位置:首页 > 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如何输入数组

输入数组的方法 在Java中,可以通过多种方式输入数组,具体取决于输入源(如控制台、文件等)和数组类型(如基本类型或对象类型)。以下是几种常见的方法: 使用Scanner从控制台输入 对于基本数据类…

java如何创建包

java如何创建包

创建Java包的步骤 在Java中,包(package)用于组织和管理类文件,避免命名冲突。以下是创建Java包的详细方法: 定义包名 在Java源文件的开头使用package关键字声明包名。包名…

java中如何获取当前时间

java中如何获取当前时间

获取当前时间的几种方法 使用 java.time 包(Java 8及以上推荐) import java.time.LocalDateTime; LocalDateTime currentTime =…

如何导入java项目

如何导入java项目

导入Java项目的方法 使用IDE导入(如IntelliJ IDEA或Eclipse) 打开IDE后选择导入现有项目,导航至项目根目录(包含pom.xml或build.gradle的文件位置)。IDE…

vue实现java登录注册

vue实现java登录注册

实现 Vue 与 Java 后端的登录注册功能 前端 Vue 部分 安装必要的依赖(如 axios 用于 HTTP 请求): npm install axios 创建登录表单组件(Login.vue…

php 实现 java md5

php 实现 java md5

在 PHP 中实现与 Java 相同的 MD5 哈希算法,关键在于确保编码和输出格式的一致性。以下是具体实现方法和注意事项: 确保字符串编码一致 Java 的 String.getBytes() 默…