2010-04-28 3 views
16

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

** первый * * место для чтения на синтаксисе SQL Server - это Books Online, документация, поставляемая с SQL Server. –

+1

вы не отметили принятый ответ, но я уверен надеюсь, вы понимаете разницу, они совершенно разные. Не понимая этого основного момента, вам не хватает одной из самых фундаментальных точек SQL. –

ответ

26

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

Я думаю, что они «похожи на« конструкцию if »могут быть немного обманчивыми. Мне нравится @Mike Муни «похожее на фигурные скобки {} в C#/C++/Java» –

+0

Спасибо. Я исправил сообщение. –

2

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

BEGIN..END знак блок кода, например, в случае заявления

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

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

4

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

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

2

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

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

«BEGIN инициирует блок транзакции, то есть, все заявления после того, как команда НАЧАТЬ будет выполняться в одной транзакции до явного COMMIT или ROLLBACK дается.По умолчанию (без BEGIN) PostgreSQL выполняет транзакции в режиме «autocommit», т. Е. Каждый оператор выполняется в своей собственной транзакции, и фиксация неявно выполняется в конце инструкции (если выполнение было успешным, в противном случае выполняется откат).»

0

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

я думаю, что мы используем END только для НАЧАТЬ ключевое слово не НАЧАТЬ транс мы используем фиксацию или откат для НАЧАТЬ транс

Смежные вопросы