sql—事务等待提交,否则会阻塞资源

s4chpxco  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(271)

我想在事务块中放入一些语句,以便在出现任何错误时脚本回滚。我将事务与 TRY 像这样阻塞(注意 INSERT 语句(通过语法错误):

begin try
    begin tran
    SET ANSI_NULLS ON
    SET QUOTED_IDENTIFIER ON

    CREATE TABLE [MY_DATABASE].[dbo].[MY_TABLE](
        [Id] [nchar](10) NULL,
        [Name] [nchar](10) NULL
    ) ON [PRIMARY]

    insert into [MY_DATABASE].[dbo].[MY_TABLE] (Id,Name) values ('1','Vampire'),  ('2')
    commit tran
end try
begin catch
    rollback tran
end catch

运行此语句后,我注意到我无法在managementstudio中获取其他表,并且操作正在等待我提交。
如何更改事务try块,以便在出现任何错误时回滚到 begin try 声明?

qij5mzcb

qij5mzcb1#

脚本尚未执行。只是语法错误导致脚本在执行前抛出错误。什么也没有开始执行。

soat7uwm

soat7uwm2#

您的脚本过早停止,而不是执行 catch 阻止。令人不满意的答案是,这是 TRY/CATCH 无法处理。
sql server启动事务,创建表,然后崩溃
msg 10709,level 16,state 1,line 117表值构造函数中每行的列数必须相同。
离开打开的事务(这就是为什么不能在mgmt studio中获取其他表)。

begin try
    begin tran
    SET ANSI_NULLS ON
    SET QUOTED_IDENTIFIER ON

    CREATE TABLE [dbo].[MY_TABLE](
        [Id] [nchar](10) NULL,
        [Name] [nchar](10) NULL
    ) ON [PRIMARY]

    insert into [dbo].[MY_TABLE] (Id,Name) values ('1','Vampire'),  ('2')
    commit tran
end try
begin catch
    print 'Now inside the "catch" block.  You will not see this message.';
    rollback tran
end catch

go
select * from MY_TABLE;
select @@trancount as TranCount;

rollback tran;

输出如下。请注意表和打开的事务的存在:

Msg 10709, Level 16, State 1, Line 117
The number of columns for each row in a table value constructor must be the same.
Id         Name
---------- ----------

(0 rows affected)

  TranCount
-----------
          1

(1 row affected)

相关问题