当前位置:首页 > Java

java如何实现事务

2026-02-05 12:40:37Java

事务的基本概念

事务是数据库操作的最小单元,具备ACID特性(原子性、一致性、隔离性、持久性)。Java中通常通过JDBC或框架(如Spring)实现事务管理。

JDBC原生事务实现

通过Connection对象控制事务,需手动管理提交和回滚:

Connection conn = null;
try {
    conn = dataSource.getConnection();
    conn.setAutoCommit(false); // 关闭自动提交

    // 执行SQL操作
    PreparedStatement stmt1 = conn.prepareStatement("UPDATE account SET balance = balance - 100 WHERE id = 1");
    stmt1.executeUpdate();

    PreparedStatement stmt2 = conn.prepareStatement("UPDATE account SET balance = balance + 100 WHERE id = 2");
    stmt2.executeUpdate();

    conn.commit(); // 提交事务
} catch (SQLException e) {
    if (conn != null) conn.rollback(); // 回滚事务
} finally {
    if (conn != null) conn.close();
}

Spring声明式事务

通过注解@Transactional简化事务管理,需配置事务管理器:

java如何实现事务

@Configuration
@EnableTransactionManagement
public class AppConfig {
    @Bean
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
}

@Service
public class AccountService {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Transactional
    public void transfer() {
        jdbcTemplate.update("UPDATE account SET balance = balance - 100 WHERE id = 1");
        jdbcTemplate.update("UPDATE account SET balance = balance + 100 WHERE id = 2");
    }
}

Spring编程式事务

通过TransactionTemplate手动控制事务边界:

@Service
public class AccountService {
    @Autowired
    private TransactionTemplate transactionTemplate;

    public void transfer() {
        transactionTemplate.execute(status -> {
            jdbcTemplate.update("UPDATE account SET balance = balance - 100 WHERE id = 1");
            jdbcTemplate.update("UPDATE account SET balance = balance + 100 WHERE id = 2");
            return null;
        });
    }
}

JTA分布式事务

适用于跨多数据源或微服务场景,需依赖JTA实现(如Atomikos):

java如何实现事务

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

@Transactional
public void distributedOperation() {
    // 操作多个数据源或服务
}

事务隔离级别配置

通过@Transactionalisolation属性指定:

@Transactional(isolation = Isolation.READ_COMMITTED)
public void updateData() {
    // 业务逻辑
}

事务传播行为

定义方法间事务如何传递,常用Propagation.REQUIRED(默认):

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void innerMethod() {
    // 始终开启新事务
}

分享给朋友:

相关文章

vue底层如何实现

vue底层如何实现

Vue 底层的核心实现机制 Vue 的底层实现主要围绕响应式系统、虚拟 DOM 和组件化架构展开。以下是关键技术的详细解析: 响应式系统 依赖追踪与发布订阅模式 通过 Object.define…

vue自动登录如何实现

vue自动登录如何实现

实现自动登录的基本思路 自动登录通常通过结合本地存储(如localStorage或cookie)和token验证机制实现。用户首次登录成功后,服务器返回的认证token会被保存在客户端,下次打开应用时…

js双击事件如何实现

js双击事件如何实现

实现双击事件的方法 在JavaScript中,可以通过监听dblclick事件或手动检测两次点击的时间间隔来实现双击事件。以下是几种常见的方法: 使用原生dblclick事件 element.a…

java如何实现多态

java如何实现多态

多态的概念 多态是面向对象编程的三大特性之一(封装、继承、多态),指同一操作作用于不同对象时,可以产生不同的行为。Java中主要通过方法重写(Override)和接口/抽象类实现多态。 实现…

java如何实现异步

java如何实现异步

Java实现异步的方法 Java中实现异步编程可以通过多种方式,每种方式适用于不同的场景和需求。以下是常见的实现方法: 使用Thread类 创建新线程执行异步任务是最基础的方式。通过继承Thread…

如何实现java序列化

如何实现java序列化

实现Java序列化的方法 1. 实现Serializable接口 要使一个类可序列化,需要让该类实现java.io.Serializable接口。这是一个标记接口,没有任何方法需要实现。 publi…