当前位置:首页 > 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简化事务管理,需配置事务管理器:

@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):

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

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

事务隔离级别配置

通过@Transactionalisolation属性指定:

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

事务传播行为

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

java如何实现事务

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

分享给朋友:

相关文章

Vue如何实现多级域名

Vue如何实现多级域名

Vue 实现多级域名的方法 Vue 本身是一个前端框架,多级域名的实现通常需要结合后端配置和前端路由。以下是几种常见的方法: 使用路由动态匹配 在 Vue Router 中可以通过动态路由参数匹配…

h5响应式布局如何实现

h5响应式布局如何实现

使用媒体查询(Media Queries) 通过CSS媒体查询针对不同屏幕尺寸设置不同的样式规则。例如: @media screen and (max-width: 768px) { .co…

vue如何实现单选

vue如何实现单选

使用原生 HTML 单选按钮 在 Vue 中可以直接使用 HTML 的原生单选按钮,通过 v-model 绑定数据。 <template> <div>…

java如何实现异步

java如何实现异步

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

h5如何实现蜡烛点亮

h5如何实现蜡烛点亮

实现蜡烛点亮的H5方法 在H5中实现蜡烛点亮效果,可以通过CSS动画、Canvas绘图或结合JavaScript交互来实现。以下是几种常见的方法: 使用CSS动画和JavaScript 通过…

vue如何实现轮播

vue如何实现轮播

使用 Vue 实现轮播 使用第三方库(推荐) Vue 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper。以下是使用 vue-awesome-swiper 的示…