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

Ric*_*ich 22 sql sql-server transactions

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

这样做有什么区别:

BEGIN
    -- Some update, insert, set statements
END
Run Code Online (Sandbox Code Playgroud)

这样做

BEGIN TRANS
    -- Some update, insert, set statements
COMMIT TRANS
Run Code Online (Sandbox Code Playgroud)

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

Pau*_*ams 29

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

if (somethingIsTrue)
{ // like BEGIN
    // do something here
} // like END
Run Code Online (Sandbox Code Playgroud)

在SQL中,这是:

if somethingIsTrue
BEGIN
    -- do something here
END
Run Code Online (Sandbox Code Playgroud)

BEGIN TRAN,COMMIT以及ROLLBACK开始和结束交易.他们没有指定新的代码块; 它们只标记交易边界.

需要注意的是,你可以写一个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
Run Code Online (Sandbox Code Playgroud)


Mik*_*ney 5

常规的BEGIN和END不用于事务处理。相反,它们仅用于指示某些代码块是单个单元,就像C#/ C ++ / Java中的大括号{}一样。

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