Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
4-1104150188
Pavlik_Morozov
2004-12-27 15:23
2005.02.13
Как извлечь многоугольник из структуры TEMRExtSelectClipRgn?


1-1106819789
SlaT
2005-01-27 12:56
2005.02.13
Delphi и обработка нажатий клавиш в др. приложениях


14-1106663738
}|{yk
2005-01-25 17:35
2005.02.13
Никто не встречал системы


1-1106306318
Weare
2005-01-21 14:18
2005.02.13
Почта и Делфи


6-1101735729
Knight
2004-11-29 16:42
2005.02.13
Что такое со стримом?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский