Форум: "Базы";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];
ВнизМожна ли сделать, чтобы внутри транзакции часть кода не откатывал Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.037 c