You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React与SQL Server事务管理异常:提交前未回滚插入数据问题

问题根源及解决方案

核心问题是业务层的数据库操作未绑定到上层创建的事务上下文,导致插入操作脱离事务控制,自动提交。

具体问题分析

你在接口层创建了事务并传入service方法,但addRegistrant方法并没有使用这个事务对象执行数据库操作:

  • 方法内重新获取了独立的连接池pool,并基于该池创建request
  • 默认情况下,独立连接池的request会开启自动提交(autocommit: true),所以插入操作执行后立即提交,和上层事务无关,自然不会被回滚

修复步骤

1. 修改业务层方法,使用传入的事务对象

将addRegistrant方法改为通过传入的transaction创建request,而不是直接从连接池获取:

async addRegistrant(registrantData, transaction) {
    const salt = generateSalt();
    const hash = await hashPassword(registrantData.password, salt);
    // 基于传入的事务创建request,而非独立连接池
    const result = await transaction.request()
            .input('email', sql.VarChar, registrantData.email)
            .input('salt', sql.VarChar, salt)
            .input('password', sql.VarChar, hash)
            .input('lastName', sql.VarChar, registrantData.lastName)
            .input('firstName', sql.VarChar, registrantData.firstName)
            .input('middleInitial', sql.VarChar, registrantData.middleInitial)
            .input('dateOfBirth', sql.Date, registrantData.dateOfBirth)
            .query('INSERT INTO Registrant_Physical (email, salt, password, lastName, firstName, dateOfBirth) OUTPUT INSERTED.* VALUES (@email, @salt, @password, @lastName, @firstName, @dateOfBirth)');
    return result.recordset[0];
}

2. 同步修改其他关联业务方法

对createVerificationTokenForNewRegistrant等涉及数据库操作的方法执行同样的修改,确保所有需要纳入事务的操作都基于同一个事务对象创建request。

3. 验证事务逻辑

修改完成后,再次模拟提交前错误,此时所有通过事务request执行的插入操作都会被回滚,不会写入数据库。

内容的提问来源于stack exchange,提问作者Clyde Symonette

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 16:57:41