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
是关闭的,那么如果可能的话,在出现错误后将继续执行。(这是一种简化。
开始
结束
与交易无关<代码>开始传输,
提交
回滚
标记事务的开始和结束。