我有一个sproc
CREATE PROCEDURE [dbo].[GetNextImageRequest]
(...) AS
DECLARE @ReturnValue BIT
SET @ReturnValue = 1
-- Set paranoid level isolation: only one access at a time!
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
BEGIN TRY
...
UPDATE STATEMENT THAT THROWS FOREIGN KEY EXCEPTION
IF @@trancount > 0
BEGIN
COMMIT TRANSACTION
END
SET @ReturnValue = 0
END TRY
BEGIN CATCH
IF @@trancount > 0
BEGIN
ROLLBACK TRANSACTION
END
SET @ReturnValue = 1
END CATCH
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
SET NOCOUNT ON
RETURN @ReturnValue -- 0=success
GO
当我从Sql Server Management工作室手动调用时,我没有任何异常。 当我通过Entity Framework 6调用它时,我得到了
EXECUTE之后的事务计数表示不匹配的数量 BEGIN和COMMIT语句。先前的计数= 1,当前计数= 0。
我做错了什么?外键约束正在回滚,但我正在检查@@ TRANCOUNT。
答案 0 :(得分:2)
事实证明,EF6在自己的事务中包装了sproc调用。 解决方法是检查事务是否已经打开,如果尚未打开则只执行BEGIN | COMMIT | ROLLBACK TRANSACTION
答案 1 :(得分:0)
实体框架6(EF6) 在ExecuteSqlCommand之前添加此行
db.Configuration.EnsureTransactionsForFunctionsAndCommands = false;