Главная страница
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.061 c
1-1107259415
Tornado
2005-02-01 15:03
2005.02.13
Где найти DBChart???


3-1106036342
Некто
2005-01-18 11:19
2005.02.13
Медленная работа MS Access


14-1106534898
Думкин
2005-01-24 05:48
2005.02.13
С Днем рождения! 24 января


14-1106241672
Denis_
2005-01-20 20:21
2005.02.13
WIndows Xp ,NTFS


1-1106756062
Blond
2005-01-26 19:14
2005.02.13
Помощь в delphi7