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
相关产品推荐
相关产品推荐

