SQL Server BEGIN / END против BEGIN TRANS / COMMIT / ROLLBACK - PullRequest
22 голосов
/ 28 апреля 2010

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

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

BEGIN
    -- Some update, insert, set statements
END

и делает это

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

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

Ответы [ 5 ]

29 голосов
/ 28 апреля 2010

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
5 голосов
/ 28 апреля 2010

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

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

2 голосов
/ 19 декабря 2010

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

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

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

2 голосов
/ 28 апреля 2010

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

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

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

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

0 голосов
/ 28 июня 2013

я не видел END TRANS :)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...