sql-server - EF6 将每个存储过程调用包装在其自己的事务中。如何防止这种情况发生?

标签 sql-server entity-framework transactions

使用 SQL Server Profiler 进行分析:EF 6 使用 BEGIN TRANCOMMIT TRAN 包装每个存储过程调用。

这不是一个重大改变吗?

也许这不仅是一个重大更改,而且使 SP 中的任何事务逻辑都不可能实现,因为我们永远无法使用 ROLLBACK TRAN 回滚存储过程中的事务(注意:SQL Server 中没有嵌套事务),因此一次回滚会回滚到 @@TRANCOUNT 零。当我们处于事务中时,因为 EF 6,我们得到“EXECUTE 后的事务计数表明 BEGIN 和 COMMIT 语句的数量不匹配。先前计数 = 1,当前计数 = 0。”标准 SQL Server 错误。

请不要问我为什么要调用存储过程。我有数百个,所有这些都使用 TRY ... COMMIT ... CATCH ROLLBACK 逻辑。

有什么想法可以阻止 EF 6 执行此操作吗?

最佳答案

存在 ExecuteSqlCommand 方法的重载,可防止此行为:

db.Database.ExecuteSqlCommand(TransactionalBehavior.DoNotEnsureTransaction, sql, parameters);

关于sql-server - EF6 将每个存储过程调用包装在其自己的事务中。如何防止这种情况发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19991609/

相关文章:

sql - INSERT INTO WITH 公用表表达式 - SQL Server

sql-server - 如果 SQL Server USER_NAME() 是系统名,为什么它返回 NVARCHAR(256)?

mysql - 单个 SELECT 查询的 InnoDB 隔离级别

在 Entity Framework v1 中的每个方法中创建 ObjectContext 的性能成本

c# - 外键列名不同时的 Entity Framework 映射

java - Spring + JPA 事务已创建并提交,但数据库中没有结果

sql-server - 在 SQL Server 上转换为 float 并用零填充

python - 通过 pymssql 插入但没有行出现在数据库中

sql - 使用聚合函数在 Select 查询中连接多个表

c# - EF Core,通过从字符串进行 int 转换在 SQL 服务器上执行