首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Server中停止在事务中插入?

问如何在Server中停止在事务中插入?
EN

Stack Overflow用户
提问于 2020-05-29 18:10:23
回答 3查看 758关注 0票数 0

使用BEGIN TRAN语句创建查询,如果事务计数大于1,捕获错误并回滚事务,则使用BEGIN TRY语句插入两行,否则打印“事务已提交”(这是我的老师的问题,其思想是不应该使用@@trancount大于1-事务回滚)

这是我写的代码

代码语言:javascript
复制
BEGIN TRY
    BEGIN TRAN;

        INSERT INTO [Info].[Country]([name]) VALUES ('Italy');
        PRINT @@TRANCOUNT

        BEGIN TRAN
            INSERT INTO [Info].[Country]([name]) VALUES ('Jorden');
            PRINT @@TRANCOUNT

            IF @@TRANCOUNT > 1
                PRINT 'Rollback the transaction...';
            ELSE 
                PRINT 'transaction succeeded';
END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION
END CATCH;

它继续插入这两行,即使反式计数大于1。

我怎么才能解决这个!

这就是结果

​

​

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-05-29 18:40:45

我想你是想用@@ROWCOUNT代替@@TRANCOUNT

代码语言:javascript
复制
BEGIN TRY
  BEGIN TRAN MyTran;
    INSERT INTO Countries(Name) VALUES 
    ('Italy'),
    ('Jorden');
    IF @@ROWCOUNT > 1 
      ROLLBACK TRAN MyTran;
        ELSE
          COMMIT TRAN MyTran;
END TRY
BEGIN CATCH
  RAISERROR ('Error Message',  
             16, -- Severity.  
             1 -- State.  
             ); 
  ROLLBACK TRAN MyTran;
END CATCH;

如果您真的想使用嵌套事务并使用@@TRANCOUNT

代码语言:javascript
复制
BEGIN TRY
  BEGIN TRAN MyTran;
    INSERT INTO Countries(Name) VALUES ('Italy');
      BEGIN TRAN MySecTran;
        INSERT INTO Countries(Name) VALUES ('Jorden');
        IF @@TRANCOUNT > 1 
          ROLLBACK TRAN;
            ELSE
              COMMIT TRAN;
END TRY
BEGIN CATCH
    RAISERROR ('Error Message', 
               16, -- Severity.  
               1 -- State.  
               );
    ROLLBACK TRAN;
END CATCH;

这里有一个db<>fiddle,您可以在这里取消其中一个评论,看看它是如何工作的。

更新:

我又查了一遍。它没有在表中插入任何行。但是它应该插入第一个

那么你需要将tran保存为

代码语言:javascript
复制
BEGIN TRY
  BEGIN TRAN MyTran;
    INSERT INTO Countries(Name) VALUES ('Italy');
    SAVE TRAN MySaveTran; 
  BEGIN TRAN MySecTran;
    INSERT INTO Countries(Name) VALUES ('Jorden');
    IF @@TRANCOUNT > 1 
      ROLLBACK TRAN MySaveTran;
  COMMIT TRAN;
END TRY
BEGIN CATCH
  RAISERROR ('Error Message', 
             16, -- Severity.  
             1 -- State.  
             );
  ROLLBACK TRAN;
END CATCH;
票数 0
EN

Stack Overflow用户

发布于 2020-05-29 18:47:57

代码语言:javascript
复制
BEGIN TRY
BEGIN TRAN;
INSERT INTO [Info].[Country]([name]) VALUES ('Italy');
print @@TRANCOUNT
Begin tran
INSERT INTO [Info].[Country]([name]) VALUES ('Jorden');
print @@TRANCOUNT
if @@TRANCOUNT>1

PRINT 'Rollback the transaction...';
else 
print 'transaction successes';
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH;
GO

您实际上不是在执行回滚操作,而是将“回滚事务”更改为

代码语言:javascript
复制
BEGIN TRY
BEGIN TRAN;
INSERT INTO [Info].[Country]([name]) VALUES ('Italy');
print @@TRANCOUNT
Begin tran
INSERT INTO [Info].[Country]([name]) VALUES ('Jorden');
print @@TRANCOUNT
if @@TRANCOUNT>1
 begin
  PRINT 'Rollback the transaction...';
  ROLLBACK TRANSACTION
 end
else 
print 'transaction successes';
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH;
GO
票数 0
EN

Stack Overflow用户

发布于 2020-05-29 18:56:28

除了其他提到的错误。我想你的老师想让你好好利用尝试捕捉模式。为此,您需要知道,只有在try块内部发生错误时才执行CATCH块。请参阅TRY...CATCH (Transact-SQL)

可以使用抛出语句抛出(Transact-SQL)引发错误。

代码语言:javascript
复制
IF @@ROWCOUNT > 1
 THROW 51000, 'row count greater 1.', 1;  
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62092232

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档