【问题标题】:SQL Server - correct syntax for transactionSQL Server - 事务的正确语法
【发布时间】:2017-10-25 17:19:49
【问题描述】:

我正在尝试为多个插入创建事务,如果一个失败,我希望全部回滚。根据我发现的例子,我有这个

BEGIN TRY
BEGIN TRAN
INSERT1
INSERT2
INSERT3
INSERT4
COMMIT TRAN
END TRY
BEGIN CATCH
 IF (@@TRANCOUNT > 0)  
BEGIN  
    ROLLBACK TRANSACTION;  
END; 
INSERT INTO Errors (errornumber, errorseverity, errorstate, errorprocedure, errorline, errormessage)
    VALUES (ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_STATE(), ERROR_PROCEDURE(), ERROR_LINE(), ERROR_MESSAGE())
END CATCH

在我的示例中,INSERT4 失败。其他插入似乎正确回滚,但我收到此错误

EXECUTE 之后的事务计数表明 BEGIN 和 COMMIT 语句的数量不匹配。先前计数 = 0,当前计数 = 1。

语法正确吗?我见过其他测试 IF (XACT_STATE()) = -1 而不是 @@TRANCOUNT > 0

的示例

【问题讨论】:

  • 你有存储过程的事务?
  • 试着把INSERT INTO Errors放在ROLLBACK TRANSACTION之后

标签: sql-server


【解决方案1】:

这将回滚所有插入语句,即使只有一个失败。

如您所见,我首先截断了我的表,然后尝试将字符串值插入到 int 列中。这个原因失败了,然后语句回滚。如您所见,即使我先截断了它们,我的tran1 表和tran2 表中仍然有结果。

 BEGIN TRANSACTION;
 BEGIN TRY

 truncate table dbo.tran1;
 truncate table dbo.tran2;
 INSERT INTO dbo.Tran1
 values ('ost')

 INSERT INTO dbo.tran2
 values('gert')

 END TRY
 BEGIN CATCH
 IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;
 THROW;
 END CATCH;
 IF @@TRANCOUNT > 0 COMMIT TRANSACTION;

如果你想要它与你的错误日志看起来像这样:

BEGIN TRANSACTION;
BEGIN TRY

truncate table dbo.tran1;
truncate table dbo.tran2;


INSERT INTO dbo.tran2
values('frands')
INSERT INTO dbo.Tran1
values ('hans')


END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION;
INSERT INTO Errors (errornumber, errorseverity, errorstate, errorprocedure, 
errorline, errormessage)
VALUES (ERROR_NUMBER(), ERROR_SEVERITY(), ERROR_STATE(), ERROR_PROCEDURE(), 
ERROR_LINE(), ERROR_MESSAGE())
END CATCH;
IF @@TRANCOUNT > 0 COMMIT TRANSACTION;

表格

结果

带有错误日志的结果

【讨论】:

  • 为什么不给出理由就投反对票?我不明白..如果(无论你是谁)觉得我的回答不好,请告诉我为什么这样我可以改进.....
猜你喜欢
  • 2012-04-26
  • 2017-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多