SQL-сервер BEGIN/END vs. BEGIN TRANS/COMMIT/ROLLBACK
Я пытаюсь найти информацию в Интернете о различиях между этими утверждениями, и мне кажется, что они идентичны, но я не могу найти подтверждение этого или какого-либо сравнения между ними.
В чем разница между этим:
BEGIN
-- Some update, insert, set statements
END
и делая это
BEGIN TRANS
-- Some update, insert, set statements
COMMIT TRANS
?
Обратите внимание, что есть только необходимость отката в случае какого-либо исключения или таймаута или другого общего сбоя, не было бы условной причины отката.
Ответы
Ответ 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