Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 5 6 7 8 9 [10] 11 12 13 14 .. 25   вперед  Ctrl
 Re: Нужна помощь  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709

Dihotom wrote:

> Есть транзакция. Каждый оператор транзакции потенциально может нарушить
> целостность БД. Вам необходимо в рамках транзакции в случае нарушения
> целостности выполнять альтернативный набор операторов с целью успешного
> завершения транзакции.

Если это транзакция, то вообще-то она либо должна придти в согласовонное
(целостное) состояние базы, либо откатиться. Я-то понимаю, что вы имеете
в виду альтернативное согласованное состояние базы. Но вот что оно
всегда возможно, что оно есть всегда - далеко не факт. Как минимум есть
варианты изменения одной записи, и новое согласованное состояние БД
совпадает со старым, т.е. это - откат транзакции.

> Получилось (исходя из
> моих аргументов), что подход 3 явно выигрывает.
> Вы это каким образом опровергаете?

Я бы опроверг это прежде всего тем, что не во всех СУБД есть ислючения
(о чем я уже несколько раз упоминал тут вот в этом замечательном
и становящимся еще более замечательным топике).
Т.е. подход-то да, наиболее выигрышный. Более выигрышным было
бы только лишь "условие" (condition) или "продолжение" (continuation).
Но вот беда - не во всех СУБД они реализованы (все три).

Так что нам остаётся лишь завидовать счастливым обладателям этих
замечательных СУБД и ... откатывать транзакции.

Posted via ActualForum NNTP Server 1.4

27 авг 08, 00:45    [6112683]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709

artemana wrote:

> Я укажу на один источник, правда не технический.
> Булгаков, М&M.
> "Согласись, игемон, что перерезать волосок уж наверное может только тот,
> кто его подвесил" (Иешуа Га-Ноцри)

вы еще бы библию тут процитировали.

Posted via ActualForum NNTP Server 1.4

27 авг 08, 00:48    [6112689]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
DBA-шник
Guest
pkarklin
DBA-шник
Вот и определился Ваш порог вхождения в индустрию: у вас неверные знания, что хуже незнания.

Вы даже не потрудились заглянуть в документацию. Управление транзакциями в триггерах ORACLE есть.


Не Вам судить об уровне моих знаний. Но только в автономных: http://www.orafaq.com/faq/can_one_commit_from_within_a_trigger

DBA-шник
Теперь вопрос: вписываться ли в концепцию РСУБД программный продукт, если в контексте приложения у него на все курсоры 1 переменная состояния?


Да что Вы говорите?! Что Вы там про "незнания"...

sp_cursor_list


1. Вторым номером неплохо работать, когда уже носом ткнули.
2. Общаемся в терминах 2000-го сервера, который ваш базовый.
27 авг 08, 06:08    [6112939]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
DBA-шник
Guest
pkarklin
DBA-шник
Догмы? Для молодых все, что написано по "набитым шишкам" - догма.
После продолжительной практики, у меня появилось желание взять издание К. Дж. Дейта, и бить им по голове молодым разработчикам в течении недели. А может 2-х. Чтобы хотя-бы автора запомнили.


Что, у дейта так и написано: "Управление транзакциями в триггере - моветон"?


Сначала прочитайте, потом резюмируйте.
27 авг 08, 06:09    [6112940]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
DBA-шник
1. Вторым номером неплохо работать, когда уже носом ткнули.


Ой, да тыкайте, скока угодно. Мне абсолютно по-барабану, чего может Оракл, а чего нет.

Только позвольте и Вас ткнуть. sp_cursor_list существовала со времен MS SQL 7.0

DBA-шник
2. Общаемся в терминах 2000-го сервера, который ваш базовый.


Эт с какого перепугу такие вводные?! И почему это 2000 стал базовым? Вам так хочется?
27 авг 08, 08:23    [6112996]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
DBA-шник
Что, у дейта так и написано: "Управление транзакциями в триггере - моветон"


Сначала прочитайте, потом резюмируйте.[/quot]

Гы... Дейтом прикрываться - удобная позиции, особенно, когда своих аргументов не хватает.
27 авг 08, 08:25    [6112998]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
MasterZiv
Клиент и БД - одно приложение. Разве нет ?

Конечно нет. БД - это приложение обеспечивающее хранение информации. "Клиент" - приложение обеспечивающее работу пользователей или других приложений с этой (а также с какой-то другой) информацией.

MasterZiv
У вас клиентов много ?
Не, у нас тоже клиентов много разных, но все наши. Чужих нет.
А с моей БД работает десятка два различных приложений, написанных различными (даже не знакомыми со мной разработчиками).
В наше время ни одна серъезная корпоративная система не пишется одним разработчиком и не представляет из себя "одно приложение". "Одно приложение" это для курсовых, пожалуй.
27 авг 08, 09:18    [6113072]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
hvlad
Member

Откуда:
Сообщений: 11554
MasterZiv
Так что нам остаётся лишь завидовать счастливым обладателям этих
замечательных СУБД и ... откатывать транзакции.
Ну, наконец-то
27 авг 08, 09:21    [6113082]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Dihotom
Member

Откуда:
Сообщений: 453
Николай1
Ветка не может быть "сколь угодно сложной". Программирование - не математика, в нем нет бесконечностей.

Вы слова из контекста выдергиваете. Я написал - определяется программистом (или правильнее - проектировщиком). Как он считает нужным, так и запрограммирует.

Николай1
Такое, что не очень понятно, как (и зачем) на клиенте разбираться, из-за чего (и в какой момент) возникла проблема. Что бы потом решить, откатывать транзакцию или продолжать дальше "по альтернативному пути".

В нормальных системах в таких случаях откатывают транзакцию, возвращают на клиента диагностику, предлагают что-то поменять в консерватории и повторить сохранение/исполнение.

По-моему, это именно Вам не очень понятно. Я уже все детально объяснил. Ну, а чтобы систему называть нормальной или ненормальной нужно её сначала изучить. Уже описано, какие требования могут предъявляться к системе и Ваша "нормальная" система им элементарно не удовлетворяет.

MasterZiv

Если это транзакция, то вообще-то она либо должна придти в согласовонное
(целостное) состояние базы, либо откатиться. Я-то понимаю, что вы имеете
в виду альтернативное согласованное состояние базы. Но вот что оно
всегда возможно, что оно есть всегда - далеко не факт. Как минимум есть
варианты изменения одной записи, и новое согласованное состояние БД
совпадает со старым, т.е. это - откат транзакции.

Да, не факт. И я об этом писал. Альтернативное состояние может быть по каким-то причинам такж недостижимо и должен быть выполнен откат. Я это никогда и не оспаривал.

MasterZiv

Я бы опроверг это прежде всего тем, что не во всех СУБД есть ислючения
(о чем я уже несколько раз упоминал тут вот в этом замечательном
и становящимся еще более замечательным топике).
Т.е. подход-то да, наиболее выигрышный. Более выигрышным было
бы только лишь "условие" (condition) или "продолжение" (continuation).
Но вот беда - не во всех СУБД они реализованы (все три).

Так что нам остаётся лишь завидовать счастливым обладателям этих
замечательных СУБД и ... откатывать транзакции.

Если в СУБД нет исключений, то, конечно, и спорить не о чем :))
27 авг 08, 09:23    [6113089]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
MasterZiv
У вас клиентов много ?
Не, у нас тоже клиентов много разных, но все наши. Чужих нет.
Я так понимаю, что именно в этом наши расхождения концепций и заключаются. Я говорю о написании "самодостаточной" БД, которая может быть использована различными приложениями. Причем большая часть этих приложений на момент разработки БД неизвестна. Вы же говорите о разработке некоего монолитного приложения включающего БД.
27 авг 08, 09:35    [6113130]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Bogdanov Andrey
Я говорю о написании "самодостаточной" БД, которая может быть использована различными приложениями. Я так понимаю, что именно в этом наши расхождения концепций и заключаются.


Гм... Я о том же говорил. Так что "концепции" слабо коррелируются с "самодостаточностью".
27 авг 08, 09:38    [6113142]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
pkarklin
Гм... Я о том же говорил. Так что "концепции" слабо коррелируются с "самодостаточностью".
Мы тут о промышленном программировании говорим или наколенные поделки обсуждаем? Когда я дома себе пишу программку из десятка строк для разовой обработки текстового файла, то могу туда и goto вписать, если так быстрее написать получится, - все равно программку через час выкину. Если же я делаю продукт, которые предполагается использовать и совершенствовать, то постараюсь и код понятный писать и комментарии вставить и инкапсуляцией не пренебрегать. При написании промышленных приложений я всегда предполагаю использование моего кода сторонними разработчиками.
27 авг 08, 09:53    [6113198]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Bogdanov Andrey
Мы тут о промышленном программировании говорим или наколенные поделки обсуждаем?


Нет, блин, я всю свою жизнь только и делал, что на коленке писал и тут же сразу выбрасывал.

Что для Вас "промышленное программирование"? О каком уровне\классе систем идет речь? ТТХ можете озвучить?
27 авг 08, 09:58    [6113215]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709

Bogdanov Andrey wrote:

Клиент без БД как и БД без клиента никому не нужны. Отсюда вывод -
это одно приложение.

> А с моей БД работает десятка два различных приложений, написанных
> различными (даже не знакомыми со мной разработчиками).
> В наше время ни одна серъезная корпоративная система не пишется одним
> разработчиком и не представляет из себя "одно приложение". "Одно
> приложение" это для курсовых, пожалуй.

Ну наша вот пишется. :-) не одним, конечно, далеко не одним.

Posted via ActualForum NNTP Server 1.4

27 авг 08, 12:34    [6114143]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709

Dihotom wrote:

> Если это транзакция, то вообще-то она либо должна придти в согласовонное
> (целостное) состояние базы, либо откатиться. Я-то понимаю, что вы имеете
> в виду альтернативное согласованное состояние базы. Но вот что оно
> всегда возможно, что оно есть всегда - далеко не факт. Как минимум есть
> варианты изменения одной записи, и новое согласованное состояние БД
> совпадает со старым, т.е. это - откат транзакции.
>
>
> Да, не факт. И я об этом писал. Альтернативное состояние может быть по
> каким-то причинам такж недостижимо и должен быть выполнен откат. Я это
> никогда и не оспаривал.

Ну так тогда сделайте и следующий шаг (остался только один).
Признайте что можно откатывать транзакцию в триггере.

> Если в СУБД нет исключений, то, конечно, и спорить не о чем :))

В MSSQL ислючений нет. В MySQL я так понимаю тоже особенно нет
(есть, но маленькие).

Posted via ActualForum NNTP Server 1.4

27 авг 08, 12:36    [6114160]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Dihotom
Member

Откуда:
Сообщений: 453
MasterZiv
Ну так тогда сделайте и следующий шаг (остался только один).
Признайте что можно откатывать транзакцию в триггере.

Это какая же должна быть цепочка рассуждений, чтобы сделать такой шаг? Почему из самой возможности отката транзакции следует, что место этому откату в триггере?

MasterZiv
В MSSQL ислючений нет. В MySQL я так понимаю тоже особенно нет
(есть, но маленькие).

А можете меня просветить (это без сарказма), как поведет себя транзакционный код под управлением MS SQL в следующем случае:
Действие A, выполняющее некоторую модификацию данных.
Действие B, выполняющее модификацию с проверкой целостности данных в триггере. Триггер обнаруживает нарушение целостности, за отсутствием исключений никак не может сообщить об этом непосредственно транзакции (так ли это?), поэтому просто откатывает её.
Действие C, выполняющее некоторую модификацию данных (в случае отката транзакции будет ли они выполнено, ведь триггер выполнил откат, но как об этом узнает "Действие C"?)
27 авг 08, 12:57    [6114313]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
MasterZiv

В MSSQL ислючений нет.


Не совсем так.


BEGIN TRY
  RAISERROR('Упсс!!!!', 16, 1)
END TRY
BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber,
        ERROR_SEVERITY() AS ErrorSeverity,
        ERROR_STATE() as ErrorState,
        ERROR_LINE() as ErrorLine,
        ERROR_MESSAGE() as ErrorMessage
END  CATCH

ErrorNumberErrorSeverityErrorStateErrorLineErrorMessage
500001613Упсс!!!!


Но речь не об этом. Замена в триггере ROLLBACK на просто генерацию исключения потребует обязательности наличия обработчика этих исключений на уровне вызывающего кода, ибо:

SET XACT_ABORT ON
GO

BEGIN TRAN 
  PRINT @@TRANCOUNT
  RAISERROR('Упсс!!!!', 16, 1)
  PRINT @@TRANCOUNT  
COMMIT

1
Server: Msg 50000, Level 16, State 1, Line 4
Упсс!!!!
1
27 авг 08, 13:05    [6114370]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Dihotom
А можете меня просветить (это без сарказма), как поведет себя транзакционный код под управлением MS SQL в следующем случае:
Действие A, выполняющее некоторую модификацию данных.
Действие B, выполняющее модификацию с проверкой целостности данных в триггере. Триггер обнаруживает нарушение целостности, за отсутствием исключений никак не может сообщить об этом непосредственно транзакции (так ли это?), поэтому просто откатывает её.
Действие C, выполняющее некоторую модификацию данных (в случае отката транзакции будет ли они выполнено, ведь триггер выполнил откат, но как об этом узнает "Действие C"?)


Я уже приводил byae, что будет, если в триггере выполнен ROLLBACK. Исключения есть, как я это выше показал. До выполнения действия С дело не дойдет, ибо ROLLBACK в триггере прерывает выполнение бача с выдачей ошибки 3609.
27 авг 08, 13:07    [6114382]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Dihotom
Member

Откуда:
Сообщений: 453
pkarklin
...

Подведу итог (на сколько я понял представленную информацию).
В SQL Server генерация исключения приводит к реальному прерыванию последовательности операторов только в том случае, если для этой транзакции явно указан обработчик исключений
Вызов ROLLBACK прерывает выполнение последовательности операторов и возвращает управление оператору, следующему за END TRAN.

Теперь если вернуться к триггеру, то обнаружив нарушение целостности он может сообщить об этом транзакции одним единственным способом (кроме отката) - сгенерировать исключение. Однако, в случае отсутствия обработчика исключений транзакция завершится как ни в чем не бывало с нарушением целостности. Так?

Именно поэтому, чтобы не зависеть от добросовестности (или недобросовестности) разработчиков Вы предпочитаете откатывать транзакцию в триггере, заодно частично имитируя при этом генерацию исключения (прерывание последовательности операторов, оформленных в виде транзакции)?
27 авг 08, 13:31    [6114594]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Dihotom

В SQL Server генерация исключения приводит к реальному прерыванию последовательности операторов только в том случае, если для этой транзакции явно указан обработчик исключений
Вызов ROLLBACK прерывает выполнение последовательности операторов и возвращает управление оператору, следующему за END TRAN.

Теперь если вернуться к триггеру, то обнаружив нарушение целостности он может сообщить об этом транзакции одним единственным способом (кроме отката) - сгенерировать исключение. Однако, в случае отсутствия обработчика исключений транзакция завершится как ни в чем не бывало с нарушением целостности. Так?


Вы сами вдумайтесь в свой вывод: "транзакция завершатеся с нарушением целостности". Вряд ли такая СУБД имела право на существование. Вы о какой целостности сейчас говорите? М.б. я Вас (или Вы меня) не так поняли? На основании каких моих высказываний, приведенных мною цитат и исходных кодов Вы сделали такой вывод?

Dihotom
Именно поэтому, чтобы не зависеть от добросовестности (или недобросовестности) разработчиков Вы предпочитаете откатывать транзакцию в триггере, заодно частично имитируя при этом генерацию исключения (прерывание последовательности операторов, оформленных в виде транзакции)?


Я откатываю транзакцию потому, что для меня транзакция - это неделимая операция. Сколько раз можно это повторять?
27 авг 08, 14:07    [6114887]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Dihotom
Member

Откуда:
Сообщений: 453
pkarklin
Вы сами вдумайтесь в свой вывод: "транзакция завершатеся с нарушением целостности". Вряд ли такая СУБД имела право на существование. Вы о какой целостности сейчас говорите? М.б. я Вас (или Вы меня) не так поняли? На основании каких моих высказываний, приведенных мною цитат и исходных кодов Вы сделали такой вывод?

Непонимание уже давно налицо :)
Вот код, который Вы привели:
SET XACT_ABORT ON
GO

BEGIN TRAN 
  PRINT @@TRANCOUNT
  RAISERROR('Упсс!!!!', 16, 1)
  PRINT @@TRANCOUNT  
COMMIT

1
Server: Msg 50000, Level 16, State 1, Line 4
Упсс!!!!
1

Правильно ли я понимаю, что, судя по двум единичкам, оба PRINTа отработали, несмотря на то, что между ними было сгенерировано исключение? Просто Вы приводите код (на T-SQL?) без комментариев, который я могу неправильно интерпретировать, поскольку пишу на PL\SQL и не знаю T-SQL.
27 авг 08, 14:17    [6114948]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
hotom
Правильно ли я понимаю, что, судя по двум единичкам, оба PRINTа отработали, несмотря на то, что между ними было сгенерировано исключение?


Правильно, но в приведенном скрипте не было никаких нарущений целостности. Примеры с нарушением целостности и разными установками XACT_ABORT я уже приводил ранее.
27 авг 08, 14:21    [6114974]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
М.б. вот этот развернутый пример из документации в части Uncommittable Transactions с комментами будет более понятен:

USE AdventureWorks;
GO

-- Verify that the table does not exist.
IF OBJECT_ID (N'my_books', N'U') IS NOT NULL
    DROP TABLE my_books;
GO

-- Create table my_books.
CREATE TABLE my_books
    (
    Isbn        int PRIMARY KEY,
    Title       NVARCHAR(100)
    );
GO

BEGIN TRY
    BEGIN TRANSACTION;
        -- This statement will generate an error because the 
        -- column author does not exist in the table.
        ALTER TABLE my_books
            DROP COLUMN author;
    -- If the DDL statement succeeds, commit the transaction.
    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    SELECT
        ERROR_NUMBER() as ErrorNumber,
        ERROR_MESSAGE() as ErrorMessage;

    -- Test XACT_STATE for 1 or -1.
    -- XACT_STATE = 0 means there is no transaction and
    -- a commit or rollback operation would generate an error.

    -- Test whether the transaction is uncommittable.
    IF (XACT_STATE()) = -1
    BEGIN
        PRINT
            N'The transaction is in an uncommittable state. ' +
            'Rolling back transaction.'
        ROLLBACK TRANSACTION;
    END;

    -- Test whether the transaction is active and valid.
    IF (XACT_STATE()) = 1
    BEGIN
        PRINT
            N'The transaction is committable. ' +
            'Committing transaction.'
        COMMIT TRANSACTION;   
    END;
END CATCH;
GO
27 авг 08, 14:26    [6115005]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 54791
pkarklin
Правильно

Модератор: Пост стёрт как несодержащий информации и провокационный


Сообщение было отредактировано: 27 авг 08, 14:43
27 авг 08, 14:36    [6115060]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Dihotom
Member

Откуда:
Сообщений: 453
pkarklin

Нет, это не совсем то, с чем хочется разобраться.
Предположим, есть две транзакции (по-моему, Вы его даже приводили ранее):
BEGIN TRY               -- 1
    BEGIN TRANSACTION;  -- 2
        INSERT ...      -- 3
        UPDATE ...      -- 4
        INSERT ...      -- 5
    COMMIT TRANSACTION; -- 6
END TRY                 -- 7
BEGIN CATCH             -- 8
    PRINT ...           -- 9
END CATCH               -- 10
                        -- 11
BEGIN TRANSACTION;  -- 1
    INSERT ...      -- 2
    UPDATE ...      -- 3
    INSERT ...      -- 4
COMMIT TRANSACTION; -- 5
                    -- 6
Предположим, что на UPDATE навешан триггер. Триггер идентифицировал, что в случае выполнения UPDATE'а целостность данных будет нарушена (речь идет не о декларативной целостности данных - про это было подробно рассказано в примере на третьей странице).
Теперь рассматриваем варианты действия в триггере:
1. Условие SET XACT_ABORT ON
1.1. Генерируем исключение (и только). С какой строки продолжится выполнение программы в обоих случаях?
1.2. Откатываем транзакцию. С какой строки продолжится выполнение программы в обоих случаях?
2. Условие SET XACT_ABORT OFF
2.1. Генерируем исключение (и только). С какой строки продолжится выполнение программы в обоих случаях?
2.2. Откатываем транзакцию. С какой строки продолжится выполнение программы в обоих случаях?
27 авг 08, 14:50    [6115170]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 5 6 7 8 9 [10] 11 12 13 14 .. 25   вперед  Ctrl
Все форумы / Сравнение СУБД Ответить