一尘不染

SQL Server开始/结束vs开始传输/提交/回滚

sql

我一直在尝试在网上查找有关这些语句之间差异的信息,在我看来它们是相同的,但我找不到对此或任何形式的比较的确认。

这样做之间有什么区别:

BEGIN
    -- Some update, insert, set statements
END

并这样做

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

请注意,仅在某些异常或超时或其他一般故障的情况下才需要回滚,而不会有条件地回滚。


阅读 147

收藏
2021-03-17

共1个答案

一尘不染

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

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

在SQL中,这是:

if somethingIsTrue
BEGIN
    -- do something here
END

BEGIN TRANCOMMIT以及ROLLBACK开始和结束 交易 。他们没有指定新的代码块;它们仅标记交易边界。

注意,你可以写一个BEGINTRAN,并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
2021-03-17