具有提交和回滚的SQL事务

时间:2015-12-02 17:31:48

标签: sql transactions commit

有人可以告诉我,如果我理解START TRANSACTIONCOMMITROLLBACK的使用是否正确。

如果我想更新一个表,但希望能够在发生错误的情况下UNDO我的更新,那么这段代码是否正确的方法呢?

START TRANSACTION;  

update ar 
set doc_no = gltrans.reference  
from plxx.dbo.ar 
inner join plxx.dbo.gltrans on gltrans.LNKUNIQUE = ar.UNIQUE_CD
where gltrans.LNKUNIQUE = ar.UNIQUE_CD 
  and ar.DOC_NO <> gltrans.REFERENCE

COMMIT;

3 个答案:

答案 0 :(得分:1)

这是一个用于在sql语句中回滚错误事务的模式:

http://www.4guysfromrolla.com/webtech/041906-1.shtml

BEGIN TRY
BEGIN TRANSACTION    -- Start the transaction

update ar 
set doc_no = gltrans.reference  
from plxx.dbo.ar 
inner join plxx.dbo.gltrans on gltrans.LNKUNIQUE = ar.UNIQUE_CD
where gltrans.LNKUNIQUE = ar.UNIQUE_CD 
and ar.DOC_NO <> gltrans.REFERENCE

 -- If we reach here, success!
COMMIT
END TRY
BEGIN CATCH
-- Whoops, there was an error
IF @@TRANCOUNT > 0
 ROLLBACK

-- Raise an error with the details of the exception
DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int
SELECT @ErrMsg = ERROR_MESSAGE(),
      @ErrSeverity = ERROR_SEVERITY()

RAISERROR(@ErrMsg, @ErrSeverity, 1)
END CATCH

答案 1 :(得分:0)

是的,如果您在开始交易后发生错误&amp;在commit语句之前,该语句中的任何内容都将被回滚。如果您需要一些有关错误管理的附加功能,例如记录故障,您还可以包含Try / Catch语句。

答案 2 :(得分:0)

使用Author_ID代替BEGIN TRANSACTION。执行START TRANSACTION命令后,您可以使用UPDATE将其回滚,然后确认交易使用ROLLBACK