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

Откуда: Москва (Муром)
Сообщений: 74930
Bogdanov Andrey
Это правда? То есть если в таблице остатков висит ограничение check (balance > 0), то insert в такую таблицу с отрицательным значением откатит всю транзакцию? Я не настолько хорошо знаком с mssql, но мне такое поведение кажется невероятным.


Это будет зависеть от:

1. Уровня серьезности ошибки.
2. Установки SET XACT_ABORT ON\OFF.

Для Вашего конкретного примера:

USE tempdb
GO

CREATE TABLE T1(col1 int, CONSTRAINT T1_CK1 CHECK(col1 > 0))
GO

SET XACT_ABORT OFF
GO
BEGIN TRAN
INSERT T1(col1) VALUES(1)
INSERT T1(col1) VALUES(-1)
COMMIT
GO
SELECT * FROM T1
GO
DELETE T1
GO
SET XACT_ABORT ON
GO

BEGIN TRAN
INSERT T1(col1) VALUES(1)
INSERT T1(col1) VALUES(-1)
COMMIT
GO
SELECT * FROM T1
GO
DROP TABLE T1


Server: Msg 547, Level 16, State 1, Line 1
INSERT statement conflicted with COLUMN CHECK constraint 'T1_CK1'. The conflict occurred in database 'tempdb', table 'T1', column 'col1'.
The statement has been terminated.
col1
-----------
1

Server: Msg 547, Level 16, State 1, Line 1
INSERT statement conflicted with COLUMN CHECK constraint 'T1_CK1'. The conflict occurred in database 'tempdb', table 'T1', column 'col1'.
col1
-----------
25 авг 08, 14:43    [6105593]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Bogdanov Andrey
pkarklin
Вам надо всего навсего обработать эту исключительную ситуацию.
То есть без обработки исключений все-таки не обойтись. :)


Ну так не обойтись там, где транзакциями с клиента управляют и инструкции от-туда же идут.
25 авг 08, 14:44    [6105595]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Dimitry Sibiryakov
Member

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

pkarklin

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

Ну и где там место для отката в триггере?

Posted via ActualForum NNTP Server 1.4

25 авг 08, 14:47    [6105621]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
pkarklin
Member

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

Ну и где там место для отката в триггере?


К чему этот вопрос? Особенно в контексте вопросов заданных авторм топика? Мы снова переходим на обсуждение вопроса где размешать код на SQL - на клиенте или на сервере?
25 авг 08, 14:55    [6105694]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
pkarklin
Это будет зависеть от:

1. Уровня серьезности ошибки.
2. Установки SET XACT_ABORT ON\OFF.

Для Вашего конкретного примера:
Спасибо за информацию, я этим флагом никогда не пользовался. Надо еще осмыслить что он мог бы значить.
Но исходя из этого примера могу сделать вывод, что rollback в триггере тоже должен зависеть" от этого флага. С точки зрения пользователя БД не должно быть разницы между декларативным и триггерным ограничением целостности. То есть пользователь не должен знать каким образом реализовано ограничение. Кстати, а при установленном SET XACT_ABORT ON после raiseerror в триггере тоже будет откат всей транзакции?
25 авг 08, 14:57    [6105707]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Bogdanov Andrey
Надо еще осмыслить что он мог бы значить.


Да там и осмыслять то больно нечего:

When SET XACT_ABORT is ON, if a Transact-SQL statement raises a run-time error, the entire transaction is terminated and rolled back.

When SET XACT_ABORT is OFF, in some cases only the Transact-SQL statement that raised the error is rolled back and the transaction continues processing. Depending upon the severity of the error, the entire transaction may be rolled back even when SET XACT_ABORT is OFF. OFF is the default setting.

Compile errors, such as syntax errors, are not affected by SET XACT_ABORT.

автор
Но исходя из этого примера могу сделать вывод, что rollback в триггере тоже должен зависеть" от этого флага.


О поведении ROLLBACK в триггере я уже писал. И поведение это не изменится.
25 авг 08, 15:00    [6105737]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
pkarklin
When SET XACT_ABORT is ON, if a Transact-SQL statement raises a run-time error, the entire transaction is terminated and rolled back.
То есть при установке этого флага raiseerror в триггере откатит транзакцию. Тогда я опять не понимаю зачем нужен откат в триггере.

Попробую изложить позицию подробно (хотя подозреваю, что напрасно).

Итак кто-то разработал БД. И дал нам к этой базе интерфейс.
Первый вариант - это стандартный SQL-интерфейс. В этом случае мы для работы с БД пользуем обычные SQL выражения и не должны знать о том, как внутри реализованы ограничения этой БД (и скорее всего мы сами будем транзакциями управлять). И если вдруг разработчик БД решит, что его декларативное ограничение не удовлетворяет всем потребностям и реализует его в триггере, то приложение должно продолжать работать. В этом варианте я не вижу места, где могли бы быть полезны откаты в триггерах.
Второй вариант - разработчик предоставляет некий процедурный интерфейс к БД. В этом случае вообще неразумно использовать триггера - гораздо более наглядно всю их логику можно реализовать в этих процедурах. Вопрос о том, кто управляет транзакциями - открыт. Можно выбрать вариант, в котром все процедуры транзакционно замкнуты, а можно и на клиента транзакции возложить - но опять же в этом случае, процедуры не должны внешние транзакции откатывать или фикисровать (иначе клиент не сможет сам транзакциями управлять).
25 авг 08, 15:12    [6105856]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Bogdanov Andrey
Кстати, а при установленном SET XACT_ABORT ON после raiseerror в триггере тоже будет откат всей транзакции?


RAISERROR в триггере не приведет к откату транзакции в независимости от этой установки.

USE tempdb
GO

USE tempdb
GO

CREATE TABLE T1(col1 int)
GO
CREATE TRIGGER T1_it ON T1 
FOR INSERT AS
SET NOCOUNT ON

IF EXISTS(SELECT * FROM inserted WHERE col1 <=0) BEGIN
  RAISERROR('Упс!!!', 16, 1)
END

SET XACT_ABORT OFF
GO
BEGIN TRAN
INSERT T1(col1) VALUES(-1)
INSERT T1(col1) VALUES(1)
COMMIT
GO
SELECT * FROM T1
GO
DELETE T1
GO
SET XACT_ABORT ON
GO

BEGIN TRAN
INSERT T1(col1) VALUES(-1)
INSERT T1(col1) VALUES(1)
COMMIT
GO
SELECT * FROM T1
GO
DROP TABLE T1

Server: Msg 50000, Level 16, State 1, Procedure T1_it, Line 7
Упс!!!
col1
-----------
-1
1

Server: Msg 50000, Level 16, State 1, Procedure T1_it, Line 7
Упс!!!
col1
-----------
-1
1

И сравните с:

USE tempdb
GO

CREATE TABLE T1(col1 int)
GO
CREATE TRIGGER T1_it ON T1 
FOR INSERT AS
SET NOCOUNT ON

IF EXISTS(SELECT * FROM inserted WHERE col1 <=0) BEGIN
  ROLLBACK
  RAISERROR('Упс!!!', 16, 1)
END

SET XACT_ABORT OFF
GO
BEGIN TRAN
INSERT T1(col1) VALUES(-1)
INSERT T1(col1) VALUES(1)
COMMIT
GO
SELECT * FROM T1
GO
DELETE T1
GO
SET XACT_ABORT ON
GO

BEGIN TRAN
INSERT T1(col1) VALUES(-1)
INSERT T1(col1) VALUES(1)
COMMIT
GO
SELECT * FROM T1
GO
DROP TABLE T1

Server: Msg 50000, Level 16, State 1, Procedure T1_it, Line 7
Упс!!!
Server: Msg 3609, Level 16, State 1, Line 2
The transaction ended in the trigger. The batch has been aborted.
col1
-----------

Server: Msg 50000, Level 16, State 1, Procedure T1_it, Line 7
Упс!!!
Server: Msg 3609, Level 16, State 1, Line 3
The transaction ended in the trigger. The batch has been aborted.
col1
-----------
25 авг 08, 15:13    [6105863]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Bogdanov Andrey
То есть при установке этого флага raiseerror в триггере откатит транзакцию.


Еще раз RAISERROR сам по себе ничего не откатывает.
25 авг 08, 15:14    [6105869]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
pkarklin
Member

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

Итак кто-то разработал БД. И дал нам к этой базе интерфейс...


Почему же, напрасно. Я на практике использовал\ продолжаю использовать оба. :)
25 авг 08, 15:16    [6105877]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
pkarklin
RAISERROR в триггере не приведет к откату транзакции в независимости от этой установки.
[...skipped...]
Server: Msg 50000, Level 16, State 1, Procedure T1_it, Line 7
Упс!!!
col1
-----------
-1
1

Мда, я совсем забыл, что атомарности оператора в MSSQL нету. Для меня дико то, что выполнение оператора insert into t1 values(-1) приводжит к возникновению ошибки, но запись между тем в таблице появляется.
Пока могу сделать только один вывод для себя - постараюсь от MSSQL держаться подальше. Он никак не укладывается в мои представления о том как должны работать программные системы.
Ну а разговор о правильности/не правильности откатов в триггерах видимо не имеет смысла пока нет единства взглядов на концепции программирования.
25 авг 08, 15:20    [6105904]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
MasterZiv
Member

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

hvlad wrote:

> Если MSSQL до 2005-го года не умел обрабатывать исключения, это его
> личные проблемы Но не стоит учить плохому других.

Это - не плохое или хорошее. Это - просто разные подходы.

> спроектированный софт всегда разбит на слои, максимально изолированные
> друг от друга. Откат тр-ции не в том слое, который её создавал, есть
> грубейшее нарушение этой изоляции.

Которую вы тут же и придумали. Вот если бы это было нарушение стандарта,
или ещё чего-то специфицированного, тогда был бы разговор.
А так - это просто ваши личные измышления. Мои могут быть другими.
Ещё кого-то - третьими.

Posted via ActualForum NNTP Server 1.4

25 авг 08, 15:22    [6105923]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
MasterZiv
Member

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

Bogdanov Andrey wrote:

> А вот это - традиционная "дырка" в таких рассуждениях.
> Ты реализуешь в БД какую-то логику, которая нарушается
> и это фиксируется выбросом исключения. Но приложение,
> поймав это исключение, может всё-таки транзакцию закоммитить.
>
> А вот тут можно поподробнее? В чем дырка?

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

проблема в том, что я частично реализую эту логику транзакции в
БД, а частично - на клиенте. Это - допустимо. Но вот мне лично это
не очень пока нравится.

Posted via ActualForum NNTP Server 1.4

25 авг 08, 15:26    [6105956]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Bogdanov Andrey
Мда, я совсем забыл, что атомарности оператора в MSSQL нету. Для меня дико то, что выполнение оператора insert into t1 values(-1) приводжит к возникновению ошибки, но запись между тем в таблице появляется.


Что такое атомарность оператора? Что такое ACID я знаю. Вы о чем? Вы постулируете основываясь на предположении, что RAISERROR - это ошибка времени выполнения, что на самом деле не совсем так.

Bogdanov Andrey
Пока могу сделать только один вывод для себя - постараюсь от MSSQL держаться подальше. Он никак не укладывается в мои представления о том как должны работать программные системы.


Вот только "програмные системы" на нем работали, работают и будут работать, вне зависимости от Ваших представлений. :)

Bogdanov Andrey
Ну а разговор о правильности/не правильности откатов в триггерах видимо не имеет смысла пока нет единства взглядов на концепции программирования.


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

Откуда: Да уже и сам не знаю...
Сообщений: 2203
pkarklin
Bogdanov Andrey
Пока могу сделать только один вывод для себя - постараюсь от MSSQL держаться подальше. Он никак не укладывается в мои представления о том как должны работать программные системы.


Вот только "програмные системы" на нем работали, работают и будут работать, вне зависимости от Ваших представлений. :)
Не начинайте очередной холивар. Я же не запрещаю вам работать с MSSQL и вполне допускаю, что могут быть другие концепции программирования.
У меня есть свое представление - и мне будет некомфортно работать, если програмный продукт будет противоречить моим представлениям о правильном. Пока я вижу то, что MSSQL для меня крайне некомфортен. А я свой комфорт ценю, поэтому и буду стараться держаться от него подальше.
25 авг 08, 15:40    [6106070]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
pkarklin
Member

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


Вот только, пожалуйста, не надо "с больной головы на здоровую". ;)

Bogdanov Andrey
Пока я вижу то, что MSSQL для меня крайне некомфортен. А я свой комфорт ценю, поэтому и буду стараться держаться от него подальше.


Гм... Комофрт он приходит со временем, когда начинаешь разбираться, как и что устроено в другой СУБД. IMHO.
25 авг 08, 15:43    [6106103]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
pkarklin
Вот только, пожалуйста, не надо "с больной головы на здоровую". ;)
Ну я лишь высказал удивление, тем что в MSSQL не поддерживается незыблемое, на мой взгляд, правило. Это было лишь мое "частное" удивление.

pkarklin
Гм... Комофрт он приходит со временем, когда начинаешь разбираться, как и что устроено в другой СУБД. IMHO.
Комфорт во время обучения также крайне важен. Если изучаемый предмет ведет себя в соответствии со ожиданиями, то процесс обучения гораздо эффективнее. А если он все время норовит выкинуть что-нибудь, не укладывающееся в голове, то обучение может никогда и не завершиться.
25 авг 08, 15:55    [6106183]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
MasterZiv
Member

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

Bogdanov Andrey wrote:
> Мда, я совсем забыл, что атомарности оператора в MSSQL нету. Для меня
> дико то, что выполнение оператора insert into t1 values(-1) приводжит к
> возникновению ошибки, но запись между тем в таблице появляется.

Да есть атомарность, и никакой записи НЕ появляется в случае ошибки.

Posted via ActualForum NNTP Server 1.4

25 авг 08, 15:56    [6106195]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
MasterZiv
Member

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

pkarklin wrote:

> Что такое атомарность оператора? Что такое ACID я знаю. Вы о чем? Вы

Ну есть, есть такое понятие. Атомарность оператора. Во-первых, чтобы
оператор не видел свои собственные изменения. Во-вторых, чтобы
если он не отработал, то целиком. и т.п.

В MSSQL она естественно есть, её вообще не быть не может.

Posted via ActualForum NNTP Server 1.4

25 авг 08, 15:58    [6106214]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
MasterZiv
Member

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

Bogdanov Andrey wrote:

> Не начинайте очередной холивар. Я же не запрещаю вам работать с MSSQL и

Да это - типисчный взгляд интербейзников. Там просто по-другому нельзя,
там по-другому и быть не может. Вот они всем свою религию и несут.

Posted via ActualForum NNTP Server 1.4

25 авг 08, 16:00    [6106219]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
MasterZiv
Да есть атомарность, и никакой записи НЕ появляется в случае ошибки.
Ну тут я спорить не буду. Я свой вывод из приведенного pkarklin примера сделал - там запись вроде осталась.
25 авг 08, 16:00    [6106220]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
pkarklin
Member

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

Ну есть, есть такое понятие. Атомарность оператора. Во-первых, чтобы
оператор не видел свои собственные изменения. Во-вторых, чтобы
если он не отработал, то целиком. и т.п.


Спасибо. С теоретическим определением я знаком. Мой вопрос был алресован Bogdanov Andrey. И мне интересно узнать, что для него "атомарность оператора" и как на основании моего примера он сделал вывод, что

Bogdanov Andrey
Мда, я совсем забыл, что атомарности оператора в MSSQL нету.


Что для него является "оператором", что он понимает по его "атомарностью" и где здесь нарушение. Особенно в контексте реляционных СУБД и приведенного примера.

Bogdanov Andrey
Для меня дико то, что выполнение оператора insert into t1 values(-1) приводжит к возникновению ошибки, но запись между тем в таблице появляется


Нет в приведенном примере никакой ошибки. Третий раз повторюсь, что RAISERROR только взводит флаг @@error и отправляет сообщение клиенту.

Bogdanov Andrey
Комфорт во время обучения также крайне важен. Если изучаемый предмет ведет себя в соответствии со ожиданиями, то процесс обучения гораздо эффективнее. А если он все время норовит выкинуть что-нибудь, не укладывающееся в голове, то обучение может никогда и не завершиться.


Вот в этом и заключается Ваша ошибка в подходе к "обучению". Не надо подходить к другому продукту со своими ожиданиями, я бы даже больше сказал, что со своими "догмами". Иначе результат будет печален и выльется в озвученный Вами дискомфорт.
25 авг 08, 16:08    [6106278]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
pkarklin
Что для него является "оператором", что он понимает по его "атомарностью".
Я так понимаю, что представления об атомарности и операторах у нас схожие, а вот взгляды на то, что такое "ошибка времени выполнения" - разные.
Не собираюсь и дальше дискутировать на эту тему. Как я уже сказал - для меня главное комфорт.

pkarklin
Вот в этом и заключается Ваша ошибка в подходе к "обучению". Не надо подходить к другому продукту со своими ожиданиями, я бы даже больше сказал, что со своими "догмами". Иначе результат будет печален и выльется в озвученный Вами дискомфорт.
Мне мой подход ни какого дискомфорта при изучении десятка языков программирования. Изменять его ради одного MSSQL не собираюсь.
25 авг 08, 16:20    [6106351]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Dimitry Sibiryakov
Member

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

MasterZiv
Вот они всем свою религию и несут.

Да нет, не мы религию несём. Это на нас идёт поток людей вроде
топикстартера, у которых мозг заточен на "специфичные фичи" MS SQL.

В-общем, я даже рад, что топикстартер остановился на MySQL... Нашим легче...

Posted via ActualForum NNTP Server 1.4

25 авг 08, 19:52    [6107325]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
hvlad
Member

Откуда:
Сообщений: 11564
MasterZiv

> спроектированный софт всегда разбит на слои, максимально изолированные
> друг от друга. Откат тр-ции не в том слое, который её создавал, есть
> грубейшее нарушение этой изоляции.

Которую вы тут же и придумали. Вот если бы это было нарушение стандарта,
или ещё чего-то специфицированного, тогда был бы разговор.
А так - это просто ваши личные измышления. Мои могут быть другими.
Ещё кого-то - третьими.
Что я придумал ? Что роллбэк в триггере, а не в точке старта тр-ции нарушает изолированность слоёв ПО ?
Продолжайте в том же духе, и - успехов в этом нелёгком труде
25 авг 08, 22:51    [6107572]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4 5 6 7 8 9 10 .. 25   вперед  Ctrl
Все форумы / Сравнение СУБД Ответить