Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有提交和回滚功能的SQL事务_Sql_Transactions_Commit - Fatal编程技术网

具有提交和回滚功能的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