当前位置:首页 > 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如何实现两栏布局

使用Flexbox实现两栏布局 Flexbox是CSS3中强大的布局方式,可以轻松实现两栏布局。在Vue中可以直接在组件的style标签中使用。 <template> <div…

react如何实现混入

react如何实现混入

在React中实现混入(Mixin)功能可以通过以下几种方式实现,React官方已不推荐使用传统的React.createClass混入方式,但可通过高阶组件或自定义Hook替代。 高阶组件(HOC…

java如何实现跨平台

java如何实现跨平台

Java实现跨平台的原理 Java通过“一次编写,到处运行”的设计理念实现跨平台能力。其核心机制包括: Java虚拟机(JVM) Java源代码编译为字节码(.class文件),由JVM解释执行。不…

如何实现翻页式h5

如何实现翻页式h5

翻页式H5的实现方法 翻页式H5通常指通过滑动或点击切换页面的交互形式,常用于营销活动、产品展示等场景。以下是几种常见的实现方式: 使用HTML5和CSS3实现基础翻页 通过CSS3的transfo…

vue如何实现404

vue如何实现404

实现 Vue 404 页面的方法 在 Vue 中实现 404 页面通常需要结合路由配置和动态路由匹配。以下是几种常见方法: 使用通配符路由匹配 在 Vue Router 配置中,可以通过 * 通配符…

vue router如何实现

vue router如何实现

Vue Router 的实现方法 Vue Router 是 Vue.js 的官方路由管理器,用于构建单页面应用(SPA)。以下是实现 Vue Router 的具体方法: 安装 Vue Router…