【发布时间】:2016-06-23 15:54:48
【问题描述】:
我必须更新表中的多个行。 我的要求是,如果由于某种原因,更新结果返回 0,那么应该回滚整个事务。 同时如果有异常发生,那么整个事务也必须回滚。
简而言之,如果更新语句返回 0 或更新表时发生任何异常,我需要回滚整个更新事务。
这是我使用的代码。
CREATE TYPE [DBO].[EMPLOYEETYPETABLETYPE] AS TABLE
( EmployeeStatusKey INT, EmployeeStatusName VARCHAR(50) )
CREATE PROCEDURE [dbo].[usp_UpdateEmployeeStatusType]
@EmploymentStatusDetails [DBO].[EMPLOYEETYPETABLETYPE] READONLY
AS
BEGIN
SET NOCOUNT ON;
DECLARE @TransactionName varchar(20) = 'UpdateEmployeeStatus';
DECLARE @rowcount1 INT
BEGIN
BEGIN TRY
BEGIN TRANSACTION @TransactionName
UPDATE ES1
SET
ES1.EmployeeStatusName=ES2.EmployeeStatusName
FROM
[dbo].[EmployeeStatusTypes] ES1
INNER JOIN
@EmploymentStatusDetails ES2
ON
ES1.EmployeeStatusKey= ES2.EmployeeStatusKey
SET
@ROWCOUNT1=@@ROWCOUNT
IF @rowcount1 =0
GOTO PROBLEM
PROBLEM:
ROLLBACK TRAN @TransactionName
COMMIT
END TRY
BEGIN CATCH
SET @ROWCOUNT1=0
ROLLBACK TRAN @TransactionName
END CATCH
IF @rowcount1 =0
SELECT -178,@rowcount1;
ELSE
SELECT 178,@rowcount1;
END
END
我正在将数据表从 C# 代码传递给存储过程。 当我执行 Sp 时,没有抛出错误但是当我从 C# 代码中调用它时,我得到了异常
异常:ROLLBACK TRANSACTION 请求没有对应的 BEGIN TRANSACTION。
请提前帮助和感谢....
【问题讨论】:
-
为什么要使用命名事务?
-
我还建议你在多个地方打印@@trancount,看看你为什么会遇到这个问题。
-
@FLICKER 刚刚在教程中看到。
标签: sql-server commit rollback sqltransaction