有人可以告诉我,如果我理解START TRANSACTION
和COMMIT
或ROLLBACK
的使用是否正确。
如果我想更新一个表,但希望能够在发生错误的情况下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;
答案 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
。