SQL Server BEGIN / END与BEGIN TRANS / COMMIT / ROLLBACK

时间:2010-04-28 14:28:43

标签: sql sql-server transactions

我一直试图在网上找到关于这些陈述之间差异的信息,在我看来它们是相同的,但我无法找到这两者的确认或两者之间的任何比较。

这样做有什么区别:

BEGIN
    -- Some update, insert, set statements
END

并且这样做

BEGIN TRANS
    -- Some update, insert, set statements
COMMIT TRANS

请注意,只有在某些异常或超时或其他常见故障的情况下才需要回滚,因此不会有回滚的条件原因。

5 个答案:

答案 0 :(得分:28)

BEGIN和END处理代码块。它们类似于您在许多语言中看到的花括号:

if (somethingIsTrue)
{ // like BEGIN
    // do something here
} // like END

在SQL中,这是:

if somethingIsTrue
BEGIN
    -- do something here
END

BEGIN TRANCOMMITROLLBACK开始和结束交易。他们没有指定新的代码块;它们只标记交易边界。

请注意,您可以在单独的代码块中编写BEGIN TRANCOMMIT。例如,如果您希望代码成为事务的一部分,但如果代码已经在事务中,您不想启动新代码,则可以执行以下操作:

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

答案 1 :(得分:5)

常规BEGIN和END不用于交易。相反,它们仅用于表示某些代码块是单个单元,非常类似于C#/ C ++ / Java中的大括号{}。

如果你有一个IF语句或WHILE循环执行10件事,你需要将它们包含在BEGIN / END中,以便SQL Server知道10个语句的整个列表应该作为该条件的一部分执行。 / p>

答案 2 :(得分:2)

这两个陈述完全不同。

BEGIN..END标记代码块,例如在if语句中

IF @something = 1
BEGIN
  -- Do something when @something is equal to 1
END

BEGIN TRANS..COMMIT TRANS将封闭块包装在事务中,并且如果发生错误,将根据服务器设置回滚事务。

答案 3 :(得分:2)

应该提到的是,有一个开头;在PostgreSQL中,它也启动了一个事务块,最初让我感到困惑。

http://www.postgresql.org/docs/9.0/static/sql-begin.html

“BEGIN启动一个事务块,也就是说,BEGIN命令之后的所有语句都将在单个事务中执行,直到给出显式的COMMIT或ROLLBACK。默认情况下(没有BEGIN),PostgreSQL以”自动提交“模式执行事务也就是说,每个语句都在自己的事务中执行,并且在语句结束时隐式执行提交(如果执行成功,否则执行回滚)。“

答案 4 :(得分:0)

我还没有看过END TRANS :)

我认为我们仅对BEGIN关键字使用END而不是BEGIN trans 我们使用提交或回滚来进行BEGIN trans