提交交易而不开始交易

时间:2019-09-13 05:59:28

标签: sql-server

我不小心遇到了一种情况,我没有在存储过程的开始处放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 TRANSACTIONROLLBACK 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

1 个答案:

答案 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有点让人分心。我已将其删除。