在我的SSMS中,我检查了“SET IMPLICIT_TRANSACTIONS”,因为我不想自动进行任何提交。当我运行以下代码时,事务仍然没有得到提交。我错过了别的什么吗?
BEGIN TRANSACTION
BEGIN TRY
EXECUTE prModifyOrAdd '73891821'
COMMIT TRANSACTION
END TRY
BEGIN CATCH
PRINT 'ERROR'
END CATCH
以下是程序的设计:
CREATE PROCEDURE [dbo].[prModifyOrAdd] @id varchar(50)
as
DECLARE @outMessage varchar(25)
update INDV834
set FILENAME= @id+'.txt'
where SUBSCRIBER_ID=@id
if (select distinct filename from INDV834 where SUBSCRIBER_ID=@id)= (@id+'.txt')
BEGIN
SET @outMessage = 'Completed: ' + (@id+'.txt')
select @outMessage
END
else
BEGIN
SET @outMessage = 'Errored'
select @outMessage
END
答案 0 :(得分:0)
如果您显式启动事务,则会忽略set implict。存储过程中发生了什么?它是否有自己的错误处理,是否在您看到之前处理错误?
许多用户使用@@ trancount包装回滚:
开始捕捉
if @@ trancount> 0
开始
rollback
端
端
答案 1 :(得分:0)
您没有看到"提交的数据"
的原因很少 0)如果您在SSMS中选中了IMPLICT_TRANSACTION
选项,那么在BEGIN TRANSACTION
之后将是两个活动交易。这意味着您需要COMMIT
语句。
注意:此时(IMPLICT_TRANSACTION ON
+ BEGIN TRANSACTION
+ 只有一个 COMMIT
),并发连接将被阻止,因为事务将处于活动状态({ {1}})。 并且,如果您关闭SSMS窗口,当前[隐式]事务将被自动取消(ROLLBACK)=>您将丢失存储过程所做的任何修改。
我的建议是避免SELECT @@TRANCOUNT
。 因此,请取消选中此选项。
IMPLICT_TRANSACTION
的{{1}} / INSERT
/ UPDATE
/ DELETE
语句可能会占用0行。例如,MERGE
语句可能包含dbo.prModifyOrAdd
子句,但来自UPDATE
的条件为WHERE
,因此会更新0行。
2)目标表的WHERE
触发器不执行任何操作或有一些错误。
示例:
false
3)您的源代码在另一个在末尾INSTEAD OF
执行的事务的上下文中执行(参见嵌套事务):
CREATE TABLE dbo.MyTable (ID INT IDENTITY(1,1) PRIMARY KEY, Col1 INT)
GO
INSERT dbo.MyTable VALUES (11)
INSERT dbo.MyTable VALUES (22)
GO
CREATE TRIGGER trgTrivialInsteadOfTrigger
ON dbo.MyTable
INSTEAD OF UPDATE
AS
BEGIN
PRINT 'trgTrivialInsteadOfTrigger activated'
END;
GO
UPDATE dbo.MyTable
SET Col1 = Col1 * 10;
SELECT * FROM dbo.MyTable;
GO
/*
-- Col1 isn't updated 11 -> 110 ...
ID Col1
----------- -----------
1 11
2 22
(2 row(s) affected)
*/
示例:
ROLLBACK