Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.13;
Скачать: CL | DM;

Вниз

Можна ли сделать, чтобы внутри транзакции часть кода не откатывал   Найти похожие ветки 

 
Bless ©   (2005-01-18 11:08) [0]

Сабж.
В хранимой процедуре одной транзакцией заполняются несколько взаимосвязанных таблиц.
Где-то посредине транзакции, после заполнения одной таблицы мне нужно проверить корректность данных внесенных только что в нее. Если какие-то записи некорректны, то надо записать информацию об этих записях в таблицу ошибок, выдать сообщение об ошибке и откатить транзакцию. Но откат транзакции приводит также и к откату записи в таблицу ошибок, а вот этого мне как раз не нужно. Как тут можно красиво выкрутиться?


 
Desdechado ©   (2005-01-18 11:25) [1]

если в mssql есть автономные транзакции, то это как раз оно


 
Ega23 ©   (2005-01-18 11:30) [2]

вынеси запись в таблицу ошибок в отдельную процедуру.
Т.е.

BEGIN TRAN
insert into ... values ....
if @@ERROR<>0
 begin
  Exec S_ErrorTable @Mode="INSERT", @Param1= .....
 end
ROLLBACK TRAN


выполнение процедур откату не подлежит.


 
Bless ©   (2005-01-18 11:52) [3]

Ega23[2]>
Вот это так новость! Нифига себе! Спасибо.
А где в BOL о подобных ньюансах можно почитать? А то я всегда думал, что вложенные процедуры откатываются и согреваемый этой мыслью написал кучу хп, которые теперь, видимо, придется переделать.


 
stone ©   (2005-01-18 11:54) [4]

...
insert into ... values ....
BEGIN TRAN t1
if <Boolean_expression>
begin
 ...
 COMMIT TRAN t1
end else
 ROLLBACK TRAN t1


 
Bless ©   (2005-01-18 12:14) [5]

Desdechado[1]>
Первый раз слышу о таком понятии. А где они есть? И как по-английски это словосочетание правильно пишется?

Ega23[2]>
Гм... Я только что проверил. Откатываются вложенные процедуры.

CREATE Procedure vv
As
SET NOCOUNT ON
BEGIN TRAN
insert into t values(1)
insert into t values(2)
insert into t values(3)
exec xx
ROLLBACK TRAN

CREATE PROCEDURE [xx]
AS
INSERT INTO t values(11)
INSERT INTO t values(22)


После exec vv в таблице t - пусто, хотя если бы xx не откатывалась, то там должны были бы быть строки 11, 22

stone[4]>

Что-то я не въехал в этот пример.
Мне надо не
else
ROLLBACK TRAN t1

а что-то в духе
else
INSERT INTO ErrTable SELECT ... FROM table1... WHERE...
ROLLBACK TRAN t1

Но так, чтобы записи в ErrTable после отката остались.
Причем если переделать кусок так:
else
ROLLBACK TRAN t1
INSERT INTO ErrTable SELECT ... FROM table1... WHERE...

то это тоже не поможет, поскольку заполняется ErrTable данными из таблицы table1, которых там вследствие ROLLBACK TRAN t1 уже нет.


 
Desdechado ©   (2005-01-18 13:10) [6]

autonomous transaction - понятие в Oracle
Означает вложенную транзакцию, которая обрабатывается самостоятельно внутри другой. Может быть подтверждена и откачена вне зависимости от исхода главной транзакции.
Иногда удобно, иногда головная боль...


 
stone ©   (2005-01-18 13:18) [7]


> Что-то я не въехал в этот пример.

Вообще-то это был пример использования вложенной транзакции.


 
stone ©   (2005-01-18 13:22) [8]

Можешь также поискать в BOL по слову savepoint


 
Ega23 ©   (2005-01-18 13:50) [9]

2 Bless ©   (18.01.05 12:14) [5]
Гм... Я только что проверил. Откатываются вложенные процедуры.

Странно, действительно откатываются... Но я же как-то делал, что вложенные процедуры не откатывались....



Страницы: 1 вся ветка

Текущий архив: 2005.02.13;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.025 c
4-1103976618
GuAV
2004-12-25 15:10
2005.02.13
WM_QUIT


4-1103722091
Woolen
2004-12-22 16:28
2005.02.13
Проблемы с печатью


6-1101649570
2modem
2004-11-28 16:46
2005.02.13
Почтовик по умолчанию


3-1105551940
Surrender1
2005-01-12 20:45
2005.02.13
Здравствуйте уважаемые мастера!!!!


9-1100257007
Wish
2004-11-12 13:56
2005.02.13
Можно ли рисовать красиво?