我一直试图在网上找到关于这些陈述之间差异的信息,在我看来它们是相同的,但我无法找到这两者的确认或两者之间的任何比较。
这样做有什么区别:
BEGIN
-- Some update, insert, set statements
END
并且这样做
BEGIN TRANS
-- Some update, insert, set statements
COMMIT TRANS
请注意,只有在某些异常或超时或其他常见故障的情况下才需要回滚,因此不会有回滚的条件原因。
答案 0 :(得分:28)
BEGIN和END处理代码块。它们类似于您在许多语言中看到的花括号:
if (somethingIsTrue)
{ // like BEGIN
// do something here
} // like END
在SQL中,这是:
if somethingIsTrue
BEGIN
-- do something here
END
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
答案 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