具有提交和回滚功能的SQL事务
有人能告诉我,我对具有提交和回滚功能的SQL事务,sql,transactions,commit,Sql,Transactions,Commit,有人能告诉我,我对START TRANSACTION和COMMIT或ROLLBACK的理解是否正确吗 如果我想更新一个表,但希望能够在出现错误时撤消更新,那么这段代码是正确的方法吗 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 gltra
START TRANSACTION
和COMMIT
或ROLLBACK
的理解是否正确吗
如果我想更新一个表,但希望能够在出现错误时撤消更新,那么这段代码是正确的方法吗
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;
启动事务;
更新ar
设置单据号=gltrans.reference
从plxx.dbo.ar
gltrans.LNKUNIQUE=ar.UNIQUE\u CD上的内部连接plxx.dbo.gltrans
其中gltrans.LNKUNIQUE=ar.UNIQUE\u CD
和ar.DOC\u无gltrans.REFERENCE
犯罪
是,如果在启动事务之后&在commit语句之前发生错误,则该语句中的任何内容都将回滚。如果您想在错误管理方面获得一些附加功能,例如记录故障,还可以包括Try/Catch语句。使用开始事务
而不是使用开始事务
。执行UPDATE
命令后,您可以使用ROLLBACK
回滚该命令,然后使用COMMIT
确认事务。以下是我用于在sql语句中出现错误时回滚事务的模式:
开始尝试
开始事务——启动事务
更新ar
设置单据号=gltrans.reference
从plxx.dbo.ar
gltrans.LNKUNIQUE=ar.UNIQUE\u CD上的内部连接plxx.dbo.gltrans
其中gltrans.LNKUNIQUE=ar.UNIQUE\u CD
和ar.DOC\u无gltrans.REFERENCE
--如果我们到达这里,成功!
犯罪
结束尝试
开始捕捉
--哎呀,出了个差错
如果@TRANCOUNT>0
回降
--使用异常的详细信息引发错误
声明@ErrMsg nvarchar(4000),@errservity int
选择@ErrMsg=ERROR\u MESSAGE(),
@ErrSeverity=错误\u严重性()
RAISERROR(@ErrMsg,@ErrSeverity,1)
端接
我刚刚犯了一到多个错误,您在更新时忘记了包含正确的where子句,因此最终更新了整个表/列。有人告诉我,如果使用start/commit,有一种方法可以回滚,因此我正在寻找正确的代码。好的,当您忘记where语句时,它不会调用将通过使用事务自动捕获的“错误”。不过,根据您的DBMS,您可以使用事务日志将数据库回滚到某个时间点。这将取决于您的DBMS和某些配置选项,如表使用的引擎。如果您关心更新所有行,则可以将更新后的@ROWCOUNT值与表行的计数进行比较,并在它们相同的情况下使用try/catch回滚。您使用的是哪种DBMS?
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