交易不提交

时间:2015-02-26 18:09:12

标签: sql sql-server tsql transactions

在我的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

2 个答案:

答案 0 :(得分:0)

如果您显式启动事务,则会忽略set implict。存储过程中发生了什么?它是否有自己的错误处理,是否在您看到之前处理错误?

许多用户使用@@ trancount包装回滚:

开始捕捉

if @@ trancount> 0

开始

rollback

答案 1 :(得分:0)

您没有看到"提交的数据"

的原因很少

0)如果您在SSMS中选中了IMPLICT_TRANSACTION选项,那么在BEGIN TRANSACTION之后将是两个活动交易。这意味着您需要COMMIT语句。

另见Nesting transactions

注意:此时(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