SQL Server开始/结束与开始传输/提交/回滚
我一直试图在网上找到关于这些说法之间差异的信息,在我看来,它们是相同的,但我找不到这方面的证实或两者之间的任何比较 这样做的区别是什么:SQL Server开始/结束与开始传输/提交/回滚,sql,sql-server,transactions,Sql,Sql Server,Transactions,我一直试图在网上找到关于这些说法之间差异的信息,在我看来,它们是相同的,但我找不到这方面的证实或两者之间的任何比较 这样做的区别是什么: BEGIN -- Some update, insert, set statements END 这么做 BEGIN TRANS -- Some update, insert, set statements COMMIT TRANS ? 请注意,只有在出现异常、超时或其他一般故障时才需要回滚,因此没有条件回滚的理由 这两种说法完全不同 BE
BEGIN
-- Some update, insert, set statements
END
这么做
BEGIN TRANS
-- Some update, insert, set statements
COMMIT TRANS
?
请注意,只有在出现异常、超时或其他一般故障时才需要回滚,因此没有条件回滚的理由 这两种说法完全不同
BEGIN..END
标记一段代码,如在if语句中
IF @something = 1
BEGIN
-- Do something when @something is equal to 1
END
BEGIN TRANS..COMMIT TRANS
将封闭块包装在事务中,并根据服务器设置在发生错误时回滚事务。开始和结束处理代码块。它们类似于许多语言中的花括号:
if (somethingIsTrue)
{ // like BEGIN
// do something here
} // like END
在SQL中,这是:
if somethingIsTrue
BEGIN
-- do something here
END
开始交易
,提交
,以及回滚
开始和结束交易。它们不指定新的代码块;它们只标记交易边界
请注意,您可以在单独的代码块中编写BEGIN-TRAN
和COMMIT
。例如,如果希望代码成为事务的一部分,但如果代码已在事务中,则不希望启动新代码,则可以执行以下操作:
declare @TranStarted bit = 0
if @@trancount = 0
begin
set @TranStarted = 1
begin tran
end
-- ... do work ...
if @TranStarted = 1
begin
commit
set @TranStarted = 0
end
常规开始和结束不用于事务。相反,它们只是用于指示某些代码块是单个单元,很像C#/C++/Java中的大括号{}
如果有一个If语句或WHILE循环可以执行10件事情,那么需要将它们括在BEGIN/END中,以便SQL Server知道整个10条语句列表应该作为该条件的一部分执行。应该提到的是,有一个BEGIN;在PostgreSQL中,这也会启动一个事务块,这起初让我感到困惑 BEGIN启动事务块,即BEGIN命令后的所有语句将在单个事务中执行,直到给出显式提交或回滚。默认情况下(不带BEGIN),PostgreSQL在“自动提交”中执行事务“模式,即每个语句在其自己的事务中执行,并在语句末尾隐式执行提交(如果执行成功,则执行回滚)。”我没有看到end TRANS :) 我认为我们只对BEGIN关键字使用END,而不是BEGIN trans
我们在BEGIN trans中使用commit或rollback阅读SQL Server语法的第一个地方是联机丛书,即SQL Server随附的文档。您还没有标记一个可接受的答案,但我确实希望您理解它们之间的区别,它们是完全不同的。如果不理解这一基本点,您就错过了最基本的一点SQL的所有要点。我认为说它们“类似于'if'构造”可能有点误导。我喜欢@Mike Mooney的比喻“类似于C#/C++/Java中的大括号{}”因此,如果问题发生在begin end语句中,则不会回滚任何内容,但如果问题发生在begin transaction中,则事务将回滚。是吗?@Baahubali答案取决于。如果启用了
XACT\u ABORT
,则是,事务将回滚。如果不是,那么就不是,事务很可能保持打开状态——假设某种严重错误不会使其处于不确定状态。检查事务是否可用。但我建议启用XACT\u ABORT
。但我的理解是,begin-end不会启动事务?在我的场景中,xact_abort是关闭的,如果在begin end中有一批insert语句失败,我想其他语句会继续执行?@Baahubali如果xact_abort
是关闭的,那么如果可能的话,在出现错误后将继续执行。(这是一种简化。开始
和结束
与交易无关<代码>开始传输,提交
和回滚
标记事务的开始和结束。