sudhakarthikeyan Ответов: 2

Как обрабатывать транзакцию SQL


Создать Proc TranTest
АС
НАЧИНАЙ ТРАН

Вставить в [authors]([au_id],
[фамилия_автора],
[au_fname],
[телефон],
[контракт])
Значения ('172-32-1176',
"Ворота",
"Билл",
'800-BUY-MSFT',
1)

-- Первый запрос на обновление
Авторы обновлений
SET au_fname = 'Johnzzz'
Где au_id = '172'


-- второй запрос обновления
Авторы обновлений
SET au_fname = 'Johnzzz'
Где au_id = '175'

-- третий запрос обновления
Авторы обновлений
SET au_fname = 'Johnzzz'
Где au_id = '178'

СОВЕРШИТЬ ТРАНС
ГО

в приведенном выше я написал три оператора обновления, если предположим, что во втором операторе обновления появляется ошибка, будет ли обновлена запись первого оператора обновления.

для этого как обращаться с помощью transact sql

Что я уже пробовал:

Создать Proc TranTest
АС
НАЧИНАЙ ТРАН

Вставить в [authors]([au_id],
[фамилия_автора],
[au_fname],
[телефон],
[контракт])
Значения ('172-32-1176',
"Ворота",
"Билл",
'800-BUY-MSFT',
1)

--Первый запрос на обновление
Авторы обновлений
SET au_fname = 'Johnzzz'
Где au_id = '172'

-- второй запрос обновления
Авторы обновлений
SET au_fname = 'Johnzzz'
Где au_id = '175'

-- Третий запрос обновления
Авторы обновлений
SET au_fname = 'Johnzzz'
Где au_id = '178'

СОВЕРШИТЬ ТРАНС
ГО

в приведенном выше я написал три оператора обновления, если предположим, что во втором операторе обновления появляется ошибка, будет ли обновлена запись первого оператора обновления.

для этого как обращаться с помощью transact sql

2 Ответов

Рейтинг:
1

Jesus Carroll

Полезным способом является ПРОБОВАТЬ... ЛОВИТЬ Блокируется при обработке транзакций с откатом. Кроме того, если вам нужно определить источник ошибки, вы получите @@ERROR системная функция. Такой подход можно объединить следующим образом:

Use YourDatabase;
GO

Create Proc TranTest
AS
	BEGIN TRANSACTION;
	
	-- Declare and initialize a variable to hold @@ERROR.
	DECLARE @ErrorSave0 INT; @ErrorSave1 INT, @ErrorSave2 INT;
	SET @ErrorSave1 = 0;
	SET @ErrorSave2 = 0;
	
	BEGIN TRY
	 
		INSERT INTO [authors]([au_id], 
		[au_lname], 
		[au_fname], 
		[phone], 
		[contract])
		VALUES	('172-32-1176', 
		'Gates', 
		'Bill', 
		'800-BUY-MSFT', 
		1)

		-- Save @@ERROR value in first local variable for INSERT
		SET	@ErrorSave0  = @@ERROR;
		
		-- First Update query
		UPDATE authors
		SET	au_fname = 'Johnzzz'
		WHERE	au_id = '172'

		SET @ErrorSave1 = @@ERROR;

		-- second Update query
		UPDATE authors
		SET	au_fname = 'Johnzzz'
		WHERE	au_id = '175'

		SET @ErrorSave2 = @@ERROR;
		
		/* ... another sentences 
		        here ...
		*/
	END TRY

	BEGIN CATCH
		-- Print any error
		PRINT N'Error 0 = ' + CAST(@ErrorSave0 AS NVARCHAR(8));
		PRINT N'Error 1 = ' + CAST(@ErrorSave1 AS NVARCHAR(8));
        PRINT N'Error 2 = ' + CAST(@ErrorSave2 AS NVARCHAR(8));
        
        IF @@TRANCOUNT > 0
			ROLLBACK TRANSACTION;
			
	END CATCH;

	IF @@TRANCOUNT > 0
		COMMIT TRANSACTION;
GO


Рейтинг:
1

ZurdoDev

Существует несколько различных способов сделать это, таких как проверка ошибки после каждого оператора, использование Try Catch и установка опции. Эта статья, немного длинная,кажется, довольно хорошо описывает ваши варианты.

Обработка ошибок и транзакций в SQL Server[^]