Подтвердить что ты не робот

SQL-сервер BEGIN/END vs. BEGIN TRANS/COMMIT/ROLLBACK

Я пытаюсь найти информацию в Интернете о различиях между этими утверждениями, и мне кажется, что они идентичны, но я не могу найти подтверждение этого или какого-либо сравнения между ними.

В чем разница между этим:

BEGIN
    -- Some update, insert, set statements
END

и делая это

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

?

Обратите внимание, что есть только необходимость отката в случае какого-либо исключения или таймаута или другого общего сбоя, не было бы условной причины отката.

4b9b3361

Ответ 1

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

Ответ 2

Регулярные BEGIN и END не используются для транзакций. Вместо этого они предназначены только для указания того, что какой-то блок кода представляет собой единую единицу, подобно скобкам {} в С#/С++/Java.

Если у вас есть оператор IF или цикл WHILE, который делает 10 вещей, вам нужно заключить их в BEGIN/END, чтобы SQL Server знал, что весь список из 10 операторов должен выполняться как часть этого условия.

Ответ 3

Эти 2 утверждения совершенно разные.

BEGIN..END отметьте блок кода, например, в выражении if

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

BEGIN TRANS..COMMIT TRANS оберните охватывающий блок в транзакцию и в зависимости от настроек сервера откат транзакции, если произошла ошибка.

Ответ 4

Следует упомянуть, что есть Begin; в PostgreSQL, который также инициирует блок транзакций, который сначала смутил меня.

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

"BEGIN инициирует блок транзакции, то есть все операторы после выполнения команды BEGIN в одной транзакции, пока не будет указан явный COMMIT или ROLLBACK. По умолчанию (без BEGIN) PostgreSQL выполняет транзакции в режиме" autocommit ", т.е. каждый оператор выполняется в своей собственной транзакции, и фиксация неявно выполняется в конце инструкции (если выполнение было успешным, в противном случае выполняется откат).

Ответ 5

Я не видел КОНЕЦ ТРАНС :)

Я думаю, что мы используем END только для ключевого слова BEGIN, а не для BEGIN trans мы используем фиксацию или откат для BEGIN trans