我不小心遇到了一种情况,我没有在存储过程的开始处放Begin Transaction
,而只是写了Commit Transaction
,如下所示
ALTER PROCEDURE dbo.spTest
AS
BEGIN
DECLARE @MyId INT=1
BEGIN TRY
UPDATE Test
SET
-- Id -- this column value is auto-generated
CharName = 'david'
WHERE id=4
--Just to test locking behavior
WHILE(1=1)
BEGIN
SET @MyId=2;
END
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
END CATCH
END
我希望SQL Server能够给我一个运行时错误,但是没有发生。当然,我应该提到的是,根据我的测试,由于缺少Begin Transaction
并没有在表上获得任何锁,但是在这种情况下COMMIT TRANSACTION
和ROLLBACK TRANSACTION
的意义是什么?条件,为什么SQL Server没有引发任何错误?
编辑:
如果我删除while块并放入WaitFor
时出现COMMIT TRANSACTION
Sql引发错误
ALTER PROCEDURE dbo.spTest
AS
BEGIN
UPDATE Test
SET CharName = 'david'
WHERE id=4
PRINT 'waiting for a minute '
WAITFOR DELAY '00:00:10';
COMMIT TRANSACTION
END
现在我收到此错误
COMMIT TRANSACTION请求没有相应的BEGIN TRANSACTION
答案 0 :(得分:3)
在这种情况下进行COMCOMM TRANSACTION和ROLLBACK TRANSACTION有什么意义?
在这种情况下没有意义
为什么SQL Server没有引发任何错误?
我看不到任何会引发错误的代码。如果您可以解释在何处以及为什么应该提出错误,这将会有所帮助
关于您实际上在这里做什么;
如果此proc的目的是使交易保持开放状态,则您需要更多类似以下内容:
ALTER PROCEDURE dbo.spTest
AS
BEGIN
BEGIN TRANSACTION
UPDATE Test
SET CharName = 'david'
WHERE id=4
--Endless loop
WHILE(1=1)
BEGIN
PRINT 'waiting for a minute inside a transaction. Try something from another session'
WAITFOR DELAY '00:01';
END
-- Transaction will actually never be committed
-- Because this line will never be reached
-- because it's preceded by an endless loop
COMMIT TRANSACTION
END
TRY / CATCH
有点让人分心。我已将其删除。