2015-12-02 2 views
2

Может ли кто-нибудь сказать мне, правильно ли я понимаю использование START TRANSACTION и COMMIT или ROLLBACK.Сделки SQL с фиксацией и откатом

Если я хочу обновить таблицу, но хочу, чтобы возможность UNDO обновлялась в случае ошибки, этот код был бы правильным способом?

START TRANSACTION; 

update ar 
set doc_no = gltrans.reference 
from plxx.dbo.ar 
inner join plxx.dbo.gltrans on gltrans.LNKUNIQUE = ar.UNIQUE_CD 
where gltrans.LNKUNIQUE = ar.UNIQUE_CD 
    and ar.DOC_NO <> gltrans.REFERENCE 

COMMIT; 
+1

Какие СУБД вы используете? –

ответ

0

Да, если у вас есть ошибка возникает после начала транзакции & до совершения заявления ничего в этом заявлении будет откат. Вы также можете включить операторы Try/Catch, если вы хотите получить дополнительную функциональность в управлении ошибками, например, протоколирование сбоя.

+0

Я только что сделал один-много ошибок, когда вы обновляете и забываете включить надлежащее предложение WHERE, чтобы вы в конечном итоге обновили всю таблицу/столбец, мне сказали, что есть способ откат, если вы используете start/commit, так что смотрите для правильного кода –

+0

Хорошо, когда вы забыли оператор where, он не вызывает «ошибку», которая автоматически будет поймана с помощью транзакций. Однако, в зависимости от вашей СУБД, вы можете откатить свою базу данных до момента, используя журнал транзакций. Это будет зависеть от вашей СУБД и некоторых параметров конфигурации, таких как движок, который использует таблица. –

+0

Если вы заинтересованы в обновлении всех строк, вы можете сравнить значение @@ ROWCOUNT после обновления с подсчетом строк таблицы в сочетании с попыткой/catch для отката в случае, если они совпадают. –

0

Использовать BEGIN TRANSACTION вместо START TRANSACTION. после выполнения команды UPDATE, вы можете выполнить ее возврат с помощью ROLLBACK, а затем подтвердить использование транзакции COMMIT.

1

Вот шаблон, который я использую для отката транзакции при ошибке в SQL Statement:

http://www.4guysfromrolla.com/webtech/041906-1.shtml

BEGIN TRY 
BEGIN TRANSACTION -- Start the transaction 

update ar 
set doc_no = gltrans.reference 
from plxx.dbo.ar 
inner join plxx.dbo.gltrans on gltrans.LNKUNIQUE = ar.UNIQUE_CD 
where gltrans.LNKUNIQUE = ar.UNIQUE_CD 
and ar.DOC_NO <> gltrans.REFERENCE 

-- If we reach here, success! 
COMMIT 
END TRY 
BEGIN CATCH 
-- Whoops, there was an error 
IF @@TRANCOUNT > 0 
ROLLBACK 

-- Raise an error with the details of the exception 
DECLARE @ErrMsg nvarchar(4000), @ErrSeverity int 
SELECT @ErrMsg = ERROR_MESSAGE(), 
     @ErrSeverity = ERROR_SEVERITY() 

RAISERROR(@ErrMsg, @ErrSeverity, 1) 
END CATCH 
Смежные вопросы