Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 15 16 17 18 19 [20] 21 22 23 24 25   вперед  Ctrl
 Re: Нужна помощь  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
martin_bishop
To Зайцев Фёдор:

Если бы операции нельзя было бы выделить из одной,
то не появилось бы вообще понятия "Транзакционная скобка"

Странно что об этом вообще нужно говорить

приведённое понятие не имеет прямого отношения к атомарности, как азбука Буратино не имеет отношения к конечным автоматам.

есть, знаете ли, некоторая разница между пакетами

1) выполнить
2) выполнить при условии
3) выполнить

и

1) выполнить
2) выполнить или нет - как Дайсем повелит
3) выполнить не взирая на ошибки выполнения предыдущих шагов
27 май 09, 21:48    [7237120]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
To Зайцев Фёдор:

Не "ошибки предыдущего шага", а успешный исход

Только в данном случае успехом считается любой исход этого шага (произошёл инсёрт или нет).
Подчёркиваю, ошибка, которую я хочу увидеть - это не ошибка.

Кто мне мешает считать успехом как раз "невставку строки"? Тогда остальные операции имеют смысл (именно в этом контексте).

Почему Вы мне отказываете в подобном алгоритме?

Я (и только я, а не какой-то там триггер) трактую операцию как "успех" или "неуспех", а транзакционная скобка обязана подчиниться!

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

Единственно чего нельзя: считать неуспехом любой исход :-)

Итак, например, я описал 5 операций, описал ожидаемое их поведнение и описал что я считаю успехом а что нет и вперёд - собирать из них как из кирпичиков мои хп ...
27 май 09, 22:33    [7237222]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
martin_bishop

Я (и только я, а не какой-то там триггер) трактую операцию как "успех" или "неуспех", а транзакционная скобка обязана подчиниться!

обязана только в том случае, если ваша трактовка не выходит за рамки трактовки разработчиков субд, которые не только имеют такое же право трактовки, но и имеют возможность отстоять своё мнение )
27 май 09, 22:42    [7237249]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67469
Блог
locky
Раз уж вспомнили об "инкапсуляции"...

несложно заметить, что при формальном вызове этих процедур (каждая из которых проводит свои проверки) необходимо предпринимать разные телодвижения.
Почему нужно делать разные телодвижения? Потому что процедуры - разные.

Если есть одна процедура, которая вызывает эти две и ещё несколько других, а те вызывают свои, и так далее, то мне - там, где я вызываю головную процедуру - очень неудобно, если половина ошибок возвращается так, а половина эдак.
27 май 09, 22:52    [7237272]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 67469
Блог
Зайцев Фёдор
если вы способны выделить составляющие - это не атом. всё, или ничего.

Я способен выделить составляющие из оператора INSERT..SELECT или например MERGE. Значит ли это, что они неатомарны? Вы всё ещё уверены во "всё или ничего"?
27 май 09, 22:53    [7237276]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
To Зайцев Фёдор:

Ну слав богу,

я и есть - разработчик СУБД.
А приложение - такой же пользователь, как и все остальные.
Оно (приложение) имеет право только на exec (в подавляющем большинстве случаев)

Кстати, надеюсь Вы не возражаете против оператора IF внутри транзакции?

Если нет, то вот например вариант алгоритма:

попытаться вставить строку с приведением к типу (При неудаче вставляю NULL или дефолт)
оператор try, не всегда подходит:
BOL
a TRY…CATCH construct cannot span two BEGIN…END blocks of Transact-SQL statements and cannot span an IF…ELSE construct

т.е. я рассержусь, если триггер мне что-то срубит в этот момент ...

Я могу привести массу алгоритмов, где любой исход можно считать успехом.
Я привык сам определять что такое одна операция и что такое успех ...
27 май 09, 23:06    [7237305]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Зайцев Фёдор
Member

Откуда: Лужки
Сообщений: 5308
martin_bishop
я и есть - разработчик СУБД.

на всякий случай, я имел ввиду разработчиков ядра.

martin_bishop

Кстати, надеюсь Вы не возражаете против оператора IF внутри транзакции?
не против, это как раз первый случай из
мну
1) выполнить
2) выполнить при условии
3) выполнить


Если нет, то вот например вариант алгоритма:

попытаться вставить строку с приведением к типу (При неудаче вставляю NULL или дефолт)
[/quot]
при неудаче у вас будет insert, который нельзя подтвердить.
можно использовать сейвпойнт, но тогда часть транзакции будет подтверждена.
можно (в оракле) использовать автономную транзакцию, но эт будет совсем другая транзакция.

напоминаю, мы говорим об атомарности, а не о ваших привычках (похвальных по поему мнению) определять успешный исход.

это я к тому, что вы можете убедить в своей правоте всех на этом форуме, но не думаю, что ваш сервер читает sql.ru )
28 май 09, 00:11    [7237406]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
Зайцев Фёдор
при неудаче у вас будет insert, который нельзя подтвердить.
Согласен. С конвертацией - неудачный пример
Не проверил. (сам такое не использую. хотел привести пример попроще)

Пример с усечением строки до значения меньшей длины - более удачный, но совсем неинтересный.
А что-то более жизненное привести сейчас нету сил (глаза слипаются)

В общем я имел ввиду ошибки, которые не рубят батч хранимки, те, что спокойно обрабатываются ...
28 май 09, 01:41    [7237527]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
martin_bishop

Я уж было почти согласился с тем, что
Gluk (Kazan)
не надо путать exception-ы c транзакциями
Но мне не даёт покоя один момент:

Представьте себе, для простоты, что есть три таблицы и я могу взять некую сущность (уменьшить остаток на 1) из любой из них, по принципу: если нет в первой, бери во второй и т.д.
Каждый из местечковых князьков (простите, триггеров) считает, что:
-1 это возмутительно! Казнить негодную (транзакцию)!

Теперь второй вопрос:

Правильно ли это?


А, простите, для нафига уперлось писать такую бизнес-логику именно на триггерах ???
28 май 09, 06:49    [7237609]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
Bogdanov Andrey

В данном случае очень удобно если логика и правила проверки целостности полностью скрыты внутри DML-оператора.


Ровно до тех пор пока эта логика может быть спрятана в один DML оператор
Вы слышали про существование хранимых процедур ???
28 май 09, 07:17    [7237629]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
martin_bishop
To Зайцев Фёдор:

Если бы операции нельзя было бы выделить из одной,
то не появилось бы вообще понятия "Транзакционная скобка"

Странно что об этом вообще нужно говорить


Именно поэтому Oracle оборачивает DML-операторы в savepoint-ы
Одного не пойму, причем тут rollback в триггере ??? Можно его использовать, можно не использовать.
И это никак не связано с ACID. Что напишите, то и получите
28 май 09, 07:21    [7237635]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
Зайцев Фёдор

можно использовать сейвпойнт, но тогда часть транзакции будет подтверждена.


бред
вызывайте доктора
28 май 09, 07:24    [7237636]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
locky
несложно заметить, что при формальном вызове этих процедур (каждая из которых проводит свои проверки) необходимо предпринимать разные телодвижения.
Почему нужно делать разные телодвижения? Потому что процедуры - разные.
и если вы после вызова процедуры не будете проверять флаг (как нужно делать в первом случае) или не обернёте вызов в try catch (как нужно делать во втором случае) - будете ли вы удивлены полученным результатам?
Я думаю, что не будете.

Естественно, и поэтому удобно во всех местах иметь однотипный способ возврата результатов. Если в проекте принято выставлять флаг, то так надо делать во всех процедурах проекта (правда я бы отметил, что выставление некоего глобального флага - наихудший, на мой взгляд, способ реализации). Если же проект использует exception, то никаких флагов уже не должно быть. Именно об этом Вам и толкуют - гораздо удобнее, если все ограничения (и триггерные и декларативные) возвращают результат одинаково. И раз уж декларативные ограничения не умеют делать rollback, то и в триггерах его лучше не использовать.
28 май 09, 09:42    [7237798]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
Gluk (Kazan)
Ровно до тех пор пока эта логика может быть спрятана в один DML оператор
Вы слышали про существование хранимых процедур ???

Я напомню, что мы обсуждаем необходимость использования rollback в триггерах. Также напомню, что триггер эта такая штука, которая предназначена для реализации некоторой логики внутри DML-оператора.
Если же вы осознанно отказываетесь от SQL-интерфейса к своему хранилищу данных (ваше право, хотя на мой взгляд SQL-интерфейс чрезвычайно полезная, удобная и всемподдерживаемая штука), то говорить о триггерах смысла вообще нет и это стоит обсуждать в другом топике.
28 май 09, 09:54    [7237826]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
Bogdanov Andrey
Gluk (Kazan)
Ровно до тех пор пока эта логика может быть спрятана в один DML оператор
Вы слышали про существование хранимых процедур ???

Я напомню, что мы обсуждаем необходимость использования rollback в триггерах. Также напомню, что триггер эта такая штука, которая предназначена для реализации некоторой логики внутри DML-оператора.
Если же вы осознанно отказываетесь от SQL-интерфейса к своему хранилищу данных (ваше право, хотя на мой взгляд SQL-интерфейс чрезвычайно полезная, удобная и всемподдерживаемая штука), то говорить о триггерах смысла вообще нет и это стоит обсуждать в другом топике.


А по моему нет смысла отказывться от какого либо инструмента на основании того что он не необходим. Лично мне rollback-и в тригерах нафих не вперлись (спасибо, что напомнили что это такое), но для меня это не повод повсеместно их запрещать.

положено - ешь
не положено - не ешь (с)
28 май 09, 10:08    [7237871]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
Gluk (Kazan)
Лично мне rollback-и в тригерах нафих не вперлись

Ну значит у нас с Вами взгляды совпадают. А противоречие у меня возникало вот с утверждениями о том, что неуспех выполнения любого оператора обязан приводит к откату всей транзакции:
Кудряшка
Мое персональное скромное мнение по теме дискуссии: если в транзакции возникла ошибка - ее надо откатить и точка.


Gluk (Kazan)
(спасибо, что напомнили что это такое), но для меня это не повод повсеместно их запрещать.
Повсеместно запрещать я ничего не собираюсь, но вот в моих проектах буду требовать соблюдения единства концепций.
28 май 09, 10:29    [7237966]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Владимир Смирнов
Member

Откуда: Северодвинск
Сообщений: 136
Bogdanov Andrey
в моих проектах буду требовать соблюдения единства концепций.

Вас не смущает наличие разных инструкций INSERT, UPDATE, DELETE? У них действия различны. Да ещё и разный синтаксис.
Может потребовать оставить только что-то одно? Ну, для соблюдения "единства концепций".
28 май 09, 10:55    [7238125]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
Bogdanov Andrey
Повсеместно запрещать я ничего не собираюсь, но вот в моих проектах буду требовать соблюдения единства концепций.


Ещё раз спасибо
28 май 09, 10:58    [7238139]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
martin_bishop
Member

Откуда:
Сообщений: 82
Gluk (Kazan)
Зайцев Фёдор
можно использовать сейвпойнт, но тогда часть транзакции будет подтверждена.


бред
вызывайте доктора
Не бред, Эта фраза относилась к CAST. В этом случае Фёдор прав. CAST срубит батч.
С моей точки зрение CAST тоже нарушает концепцию.
Но это можно поправить, если приводить с помощью CLR-функций
28 май 09, 11:05    [7238176]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
Владимир Смирнов
Вас не смущает наличие разных инструкций INSERT, UPDATE, DELETE? У них действия различны. Да ещё и разный синтаксис.
Может потребовать оставить только что-то одно? Ну, для соблюдения "единства концепций".

Ваш сарказм совершенно не в тему.
Если в рамки концепций некоторые конструкции не будут вписываться, то их надо запретить. Это от проекта зависит. Я например, видел системы в которых не было update и delete. И считаю, что там это было сделано правильно.
28 май 09, 11:18    [7238264]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
hvlad
Member

Откуда:
Сообщений: 11555
Gluk (Kazan)
Именно поэтому Oracle оборачивает DML-операторы в savepoint-ы
Не только Оракл, а любая СУБД, обеспечивающая атомарность выполнения операторов.

Gluk (Kazan)
Одного не пойму, причем тут rollback в триггере ??? Можно его использовать, можно не использовать.
Дело в том, что в t-sql до sql2005 не было исключений :^(
Соответственно это был единственный способ прервать "плохой" оператор.
Ну а то, что с этим оператором отваливается весь батч - дык МС лучше знает что нам надо

Gluk (Kazan)
И это никак не связано с ACID. Что напишите, то и получите
Однозначно
28 май 09, 11:32    [7238365]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Владимир Смирнов
Member

Откуда: Северодвинск
Сообщений: 136
Bogdanov Andrey
Я например, видел системы в которых не было update и delete. И считаю, что там это было сделано правильно.

А я разговаривал с начальником информационного отдела, который утверждал, что первичный ключ должен иметь возможность содержать повторяющиеся значения. Например, в случае прямого распоряжения начальства. Я считаю такое утверждение неправильным. А Вы?
28 май 09, 11:40    [7238417]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
Владимир Смирнов
Я считаю такое утверждение неправильным. А Вы?
Сомневаюсь, что Вас и нтересует мое мнение по данному вопросу. Можете и дальше выдумывать сказки про тупых начальников.
28 май 09, 11:51    [7238501]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Владимир Смирнов
Member

Откуда: Северодвинск
Сообщений: 136
Bogdanov Andrey
Можете и дальше выдумывать сказки про тупых начальников.

А вот обвинять незнакомого человека во лжи, не имея на то достаточных оснований - это с Вашей стороны хамство. И кстати, Ваши необоснованные домыслы наводят на мысль, что сказочник - Вы.
28 май 09, 12:02    [7238582]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Gluk (Kazan)
Member

Откуда:
Сообщений: 9365
martin_bishop
Gluk (Kazan)
Зайцев Фёдор
можно использовать сейвпойнт, но тогда часть транзакции будет подтверждена.


бред
вызывайте доктора
Не бред, Эта фраза относилась к CAST. В этом случае Фёдор прав. CAST срубит батч.
С моей точки зрение CAST тоже нарушает концепцию.
Но это можно поправить, если приводить с помощью CLR-функций


продолжение бреда
28 май 09, 12:07    [7238618]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 15 16 17 18 19 [20] 21 22 23 24 25   вперед  Ctrl
Все форумы / Сравнение СУБД Ответить