![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можна ли сделать, чтобы внутри транзакции часть кода не откатывал [D7, MSSQL]
Bless © (2005-01-18 11:08:00)Сабж.
В хранимой процедуре одной транзакцией заполняются несколько взаимосвязанных таблиц.
Где-то посредине транзакции, после заполнения одной таблицы мне нужно проверить корректность данных внесенных только что в нее. Если какие-то записи некорректны, то надо записать информацию об этих записях в таблицу ошибок, выдать сообщение об ошибке и откатить транзакцию. Но откат транзакции приводит также и к откату записи в таблицу ошибок, а вот этого мне как раз не нужно. Как тут можно красиво выкрутиться?
Ega23 (2005-01-18 13:50:00) [1]2 Bless © (18.01.05 12:14) [5]
Гм... Я только что проверил. Откатываются вложенные процедуры.
Странно, действительно откатываются... Но я же как-то делал, что вложенные процедуры не откатывались....
stone (2005-01-18 13:22:00) [2]Можешь также поискать в BOL по слову savepoint
stone (2005-01-18 13:18:00) [3]
> Что-то я не въехал в этот пример.
Вообще-то это был пример использования вложенной транзакции.
Desdechado (2005-01-18 13:10:00) [4]autonomous transaction - понятие в Oracle
Означает вложенную транзакцию, которая обрабатывается самостоятельно внутри другой. Может быть подтверждена и откачена вне зависимости от исхода главной транзакции.
Иногда удобно, иногда головная боль...
Bless (2005-01-18 12:14:00) [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 уже нет.
stone (2005-01-18 11:54:00) [6]...
insert into ... values ....
BEGIN TRAN t1
if <Boolean_expression>
begin
...
COMMIT TRAN t1
end else
ROLLBACK TRAN t1
Bless (2005-01-18 11:52:00) [7]Ega23[2]>
Вот это так новость! Нифига себе! Спасибо.
А где в BOL о подобных ньюансах можно почитать? А то я всегда думал, что вложенные процедуры откатываются и согреваемый этой мыслью написал кучу хп, которые теперь, видимо, придется переделать.
Ega23 (2005-01-18 11:30:00) [8]вынеси запись в таблицу ошибок в отдельную процедуру.
Т.е.
BEGIN TRAN
insert into ... values ....
if @@ERROR<>0
begin
Exec S_ErrorTable @Mode='INSERT', @Param1= .....
end
ROLLBACK TRAN
выполнение процедур откату не подлежит.
Desdechado (2005-01-18 11:25:00) [9]если в mssql есть автономные транзакции, то это как раз оно