使用BEGIN TRAN语句创建查询,如果事务计数大于1,捕获错误并回滚事务,则使用BEGIN TRY语句插入两行,否则打印“事务已提交”(这是我的老师的问题,其思想是不应该使用@@trancount大于1-事务回滚)
这是我写的代码
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。
我怎么才能解决这个!
这就是结果

发布于 2020-05-29 18:40:45
我想你是想用@@ROWCOUNT代替@@TRANCOUNT
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
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保存为
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;发布于 2020-05-29 18:47:57
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您实际上不是在执行回滚操作,而是将“回滚事务”更改为
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发布于 2020-05-29 18:56:28
除了其他提到的错误。我想你的老师想让你好好利用尝试捕捉模式。为此,您需要知道,只有在try块内部发生错误时才执行CATCH块。请参阅TRY...CATCH (Transact-SQL)
可以使用抛出语句抛出(Transact-SQL)引发错误。
IF @@ROWCOUNT > 1
THROW 51000, 'row count greater 1.', 1; https://stackoverflow.com/questions/62092232
复制相似问题