EF6中Transaction.Complete()报错:ROLLBACK无对应BEGIN TRANSACTION
EF6 BulkInsert后Transaction.Complete()触发回滚异常
问题背景
继承一段ASP.NET C#代码,使用EF6的BulkInsert()向SQL Server表(仅含少量字段)插入1至1000行记录。代码运行频繁且多数情况下成功,但偶尔会在调用Transaction.Complete()时失败——此时记录已成功插入。
相同数据在生产环境(PROD)出现异常,测试环境(QA)无异常,代码采用多线程执行插入操作,怀疑此为诱因。目标表无唯一索引或其他会引发异常的约束。
代码示例
var _TransactionOption = new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.Serializable, Timeout = TimeSpan.FromSeconds(TRANSACTION_MAXSECONDS) }; using (var _Trans = new TransactionScope(TransactionScopeOption.Required, _TransactionOption)) { _db.Configuration.AutoDetectChangesEnabled = UseAutoDetectChangesEnabled_; var options = new BulkInsertOptions { EnableStreaming = true, TimeOut = 120, SqlBulkCopyOptions = SqlBulkCopyOptions.TableLock }; _db.BulkInsert(_Data.Values, options); // 出现异常时会显示此处调试信息 _Trans.Complete(); // 此处触发异常 } catch { // 此处报告错误 }
报错信息
The ROLLBACK TRANSACTION request has no corresponding BEGIN TRANSACTION
已尝试操作
- 增加日志检查
_Data中的值,排查是否存在导致数据库端错误的数据 - 添加验证逻辑,确保插入字符串长度不超过字段限制,其他字段符合目标表要求
- 对比PROD和QA的.NET安装情况:两台服务器配置差异较大,但IIS应用程序开发组件一致
- 查阅Stack Overflow相关错误讨论,未找到解决方案
疑问
- 该错误为何发生?为何
Complete()会触发回滚错误,且异常未在BulkInsert时出现? - 若无法直接定位原因,可添加哪些日志进一步排查?
内容的提问来源于stack exchange,提问作者brit503
相关产品推荐
相关产品推荐

