Re[3]: MSSQL я в восторге :)
От: Merle Австрия http://rsdn.ru
Дата: 21.10.05 09:58
Оценка: 1 (1) +1
Здравствуйте, Mikst, Вы писали:

M>Это кто же ему такое право то дал???

Все теоретики и практики СУБД, начиная с Кодда, и заканчивая Дейтом... Почитайте книжечку Бернстайна ссылку на которую я Вам давал, там все подробнейшим образом расписано, на что сервер имеет право, а на что не имеет.

M> я специально дабы избежать неявности, открываю и закрываю транзакцию явно.

Вот все что между явным открытием и закрытием сервер (в идеале) обязан выполнить как один последовательный кусок, а вот перемещать эти кусочки между собой он может как ему нравится.

M>Эффект ридкомиттед понятен. Но двигать транзакции, это уже слишком

Как раз двигать транзакции это более чем нормально, этим все сервера занимаются, в разной степени и чем продвинутее сервер, тем свободнее он может этим заниматься...
... << RSDN@Home 1.1.4 beta 7 rev. 0>>
Мы уже победили, просто это еще не так заметно...
Re[2]: MSSQL я в восторге :)
От: Mikst  
Дата: 21.10.05 09:50
Оценка: +1 -1
Здравствуйте, Merle, Вы писали:

M>Здравствуйте, Mikst, Вы писали:



M>>но! выполняя этот тест раз за разом стал получать более удивительные числа, например 5242880072.

M>>Вот тут уж точно ничего не понимаю. Кто отгадает загадку?
M>Сервер в своем праве двигать транзакции относительно друг-друга как угодно, он вполне мог сначала прогнать несколько транзакций v+1, а потом v=1000. Ну и плюс эффект от Read Committed, который я описал в прошлый раз.

Это кто же ему такое право то дал??? я специально дабы избежать неявности, открываю и закрываю транзакцию явно.
Эффект ридкомиттед понятен. Но двигать транзакции, это уже слишком
Re[5]: MSSQL я в восторге :)
От: Mikst  
Дата: 21.10.05 15:08
Оценка: -2
M>стати, читаю тред: здесь там в середине есть пример


Очень даже занятный пример, его автор хочет показать что оракл делает "неправильно", но получается то наоборот.
непосредственно ПОСЛЕ каждой тразакции, мы имеем правильный результат, т.е. после второй(которая завершилась раньше) в базе ТОЛЬКО 2, все правильно. первая завершаясь добавляет в базу свою строчку 1, а то что делит второй не смог это удалить — ну так правильно, нечего на тот момент удалять то было .
MSSQL я в восторге :)
От: Mikst  
Дата: 21.10.05 08:35
Оценка:
Решил вынести из темы MSSQL. великие гуру, избавьте от deadlock
Автор: Mikst
Дата: 20.10.05
.


Напомню:

имеем таблицу

  create table test (i numeric identity, v numeric);

у меня в ней 5242880 записей.

далее открываем две окна Query Analyzer

в первом пишем:

begin tran
select sum(v) from test;
commit;

begin tran
select sum(v) from test;
commit;

...

begin tran
select sum(v) from test;
commit;

вобщем побольше

а во втором соответственно

begin tran
update test set v=1000;
commit;
begin tran
update test set v=v+1 where i in (4,2621440,151345,2343543,3,2620000);
commit;
...
begin tran
update test set v=1000;
commit;
begin tran
update test set v=v+1 where i in (4,2621440,151345,2343543,3,2620000);
commit;

тоже много раз.

запускаем оба и смотрим на результаты select'ов.

сперва я получил такие данные:

5242880000
5242880006
5242880000
5242880006
5242880004


Ужаснулся, но действительно при IZOLATION LEVEL READ COMMITTED такое вполне возможно и это нормально (хоть и печально).

но! выполняя этот тест раз за разом стал получать более удивительные числа, например 5242880072.

Вот тут уж точно ничего не понимаю. Кто отгадает загадку?
Re: MSSQL я в восторге :)
От: _d_m_  
Дата: 21.10.05 08:40
Оценка:
Здравствуйте, Mikst, Вы писали:

M>Решил вынести из темы MSSQL. великие гуру, избавьте от deadlock
Автор: Mikst
Дата: 20.10.05
.



M>Напомню:


M>имеем таблицу


M>
M>  create table test (i numeric identity, v numeric);
M>

M> у меня в ней 5242880 записей.

Уважаемый, а индексы где? Попробуй-ка повестить на i primary key clustered — и будет тебе счастье
Re[2]: MSSQL я в восторге :)
От: Mikst  
Дата: 21.10.05 09:00
Оценка:
Здравствуйте, _d_m_, Вы писали:

___>Здравствуйте, Mikst, Вы писали:


M>>Решил вынести из темы MSSQL. великие гуру, избавьте от deadlock
Автор: Mikst
Дата: 20.10.05
.



M>>Напомню:


M>>имеем таблицу


M>>
M>>  create table test (i numeric identity, v numeric);
M>>

M>> у меня в ней 5242880 записей.

___>Уважаемый, а индексы где? Попробуй-ка повестить на i primary key clustered — и будет тебе счастье


А простите, скакого боку-припеку тут индексы?
Re: MSSQL я в восторге :)
От: Merle Австрия http://rsdn.ru
Дата: 21.10.05 09:23
Оценка:
Здравствуйте, Mikst, Вы писали:


M>но! выполняя этот тест раз за разом стал получать более удивительные числа, например 5242880072.

M>Вот тут уж точно ничего не понимаю. Кто отгадает загадку?
Сервер в своем праве двигать транзакции относительно друг-друга как угодно, он вполне мог сначала прогнать несколько транзакций v+1, а потом v=1000. Ну и плюс эффект от Read Committed, который я описал в прошлый раз.
... << RSDN@Home 1.1.4 beta 7 rev. 0>>
Мы уже победили, просто это еще не так заметно...
Re: MSSQL я в восторге :)
От: pkarklin  
Дата: 21.10.05 09:31
Оценка:
Здравствуйте, Mikst, Вы писали:

M>Решил вынести из темы MSSQL. великие гуру, избавьте от deadlock
Автор: Mikst
Дата: 20.10.05
.


M>Вот тут уж точно ничего не понимаю. Кто отгадает загадку?


Почитайте: В блокировочнике никогда нельзя быть уверенным за правильность отчета ?!
Re[3]: MSSQL я в восторге :)
От: pkarklin  
Дата: 21.10.05 10:07
Оценка:
Здравствуйте, Mikst, Вы писали:


M>Это кто же ему такое право то дал??? я специально дабы избежать неявности, открываю и закрываю транзакцию явно.


Непонятно, только, зачем. Ведь одна инструкция = одна неявная транзакция.
Re[4]: MSSQL я в восторге :)
От: Mikst  
Дата: 21.10.05 10:48
Оценка:
Здравствуйте, pkarklin, Вы писали:

P>Здравствуйте, Mikst, Вы писали:



M>>Это кто же ему такое право то дал??? я специально дабы избежать неявности, открываю и закрываю транзакцию явно.


P>Непонятно, только, зачем. Ведь одна инструкция = одна неявная транзакция.


Знаю, для большей убедительности, приятель посоветавол, сказал что тогда все будет ок, но при этим вместо ок, появилось число *072
Re[4]: MSSQL я в восторге :)
От: Mikst  
Дата: 21.10.05 10:58
Оценка:
Здравствуйте, Merle, Вы писали:

M>Здравствуйте, Mikst, Вы писали:


M>>Это кто же ему такое право то дал???

M>Все теоретики и практики СУБД, начиная с Кодда, и заканчивая Дейтом... Почитайте книжечку Бернстайна ссылку на которую я Вам давал, там все подробнейшим образом расписано, на что сервер имеет право, а на что не имеет.

M>> я специально дабы избежать неявности, открываю и закрываю транзакцию явно.

M>Вот все что между явным открытием и закрытием сервер (в идеале) обязан выполнить как один последовательный кусок, а вот перемещать эти кусочки между собой он может как ему нравится.

M>>Эффект ридкомиттед понятен. Но двигать транзакции, это уже слишком

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

Да, в очередной раз с Вами соглашусь, что транзакции двигать можно (и даже нужно иногда), но если это транзакции от разных сессий. В одной сессии насколько я понимаю — одна транзакция. и QA должен выполнять код последовательно, как я ему написал, а не как ему взбредет в голову, ведь между
update v=1000
и
update v=v+1

я мог вставить select sum(v) и получить опять не *000 а *006 ?? так как сервер бы решил поменять Select и update местами?


to pkarklin

Почитайте: В блокировочнике никогда нельзя быть уверенным за правильность отчета ?!

Спасибо, почитал. Утвердился во мнении про блокировочники.

Вольный пересказ цитат:

1. ... да, действительно версионники позволяют быстро начать, без лишних усилий и некоторое время не знать проблем с производительностью ...
2. ... Том Кайт советует пересоздавать таблицы при удалении например 1млн записей. ...


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

откуда взялось 72 до сих пор загадка.

больше не поторялось. может и сам накосячил.
Re[3]: MSSQL я в восторге :)
От: _d_m_  
Дата: 21.10.05 11:41
Оценка:
Здравствуйте, Mikst, Вы писали:

M>Здравствуйте, _d_m_, Вы писали:


___>>Здравствуйте, Mikst, Вы писали:


M>>>Решил вынести из темы MSSQL. великие гуру, избавьте от deadlock
Автор: Mikst
Дата: 20.10.05
.



M>>>Напомню:


M>>>имеем таблицу


M>>>
M>>>  create table test (i numeric identity, v numeric);
M>>>

M>>> у меня в ней 5242880 записей.

___>>Уважаемый, а индексы где? Попробуй-ка повестить на i primary key clustered — и будет тебе счастье


M>А простите, скакого боку-припеку тут индексы?


Честно говоря поспешил — думал про дэдлок
Re[4]: MSSQL я в восторге :)
От: Mikst  
Дата: 21.10.05 12:02
Оценка:
Здравствуйте, _d_m_, Вы писали:

___>Здравствуйте, Mikst, Вы писали:


M>>Здравствуйте, _d_m_, Вы писали:


___>>>Здравствуйте, Mikst, Вы писали:


M>>>>Решил вынести из темы MSSQL. великие гуру, избавьте от deadlock
Автор: Mikst
Дата: 20.10.05
.



M>>>>Напомню:


M>>>>имеем таблицу


M>>>>
M>>>>  create table test (i numeric identity, v numeric);
M>>>>

M>>>> у меня в ней 5242880 записей.

___>>>Уважаемый, а индексы где? Попробуй-ка повестить на i primary key clustered — и будет тебе счастье


M>>А простите, скакого боку-припеку тут индексы?


___>Честно говоря поспешил — думал про дэдлок


Если можно про индексы, чем он (именно PK(id)) бы в случае дэдлока тут помог? А если сделать индекс по v поможет? или с изменением таблицы, изменим индекс и толку ноль?

ведь select sum(v) и update set v=..
Re[5]: MSSQL я в восторге :)
От: Merle Австрия http://rsdn.ru
Дата: 21.10.05 12:13
Оценка:
Здравствуйте, Mikst, Вы писали:


M>Если можно про индексы, чем он (именно PK(id)) бы в случае дэдлока тут помог?

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

M> А если сделать индекс по v поможет?

В данном случае скорее наоборот.

Вообще про дедлоки довольно подробно написано здесь: http://rsdn.ru/?article/?460
Автор(ы): Иван Бодягин
Дата: 05.05.2004
В статье рассматривается проблема взаимоблокировок, даются примеры успешного создания подобных ситуаций, а также их разрешения. Материал разбирается на примере MS SQLServer 2000.

... << RSDN@Home 1.1.4 beta 7 rev. 0>>
Мы уже победили, просто это еще не так заметно...
Re[6]: MSSQL я в восторге :)
От: Mikst  
Дата: 21.10.05 12:33
Оценка:
Здравствуйте, Merle, Вы писали:

M>Здравствуйте, Mikst, Вы писали:



M>>Если можно про индексы, чем он (именно PK(id)) бы в случае дэдлока тут помог?

M>Изменил бы порядок доступа и увеличил скорость обращения к изменяемым данным (чем снизил вероятность дедлока). Вообще индексы могут как снизить вероятность дедлока, так и увеличить...

M>> А если сделать индекс по v поможет?

M>В данном случае скорее наоборот.

M>Вообще про дедлоки довольно подробно написано здесь: http://rsdn.ru/?article/?460
Автор(ы): Иван Бодягин
Дата: 05.05.2004
В статье рассматривается проблема взаимоблокировок, даются примеры успешного создания подобных ситуаций, а также их разрешения. Материал разбирается на примере MS SQLServer 2000.




В свете всего вышеописанного почетной обязанностью разработчика является сведение вероятности мертвой блокировки к минимуму, а в идеале – к нулю, что является достаточно сложной, но вполне разрешимой задачей


Re[7]: MSSQL я в восторге :)
От: Merle Австрия http://rsdn.ru
Дата: 21.10.05 12:39
Оценка:
Здравствуйте, Mikst, Вы писали:

M>

M>В свете всего вышеописанного почетной обязанностью разработчика является сведение вероятности мертвой блокировки к минимуму, а в идеале – к нулю, что является достаточно сложной, но вполне разрешимой задачей

(C)
Ну легкой жизни никто не обещал...
Насколько я понимаю, Вы просто взяли оракловую базу и подняли ее в сиквеле, ясен байт, что при таком подходе не то что дедлоки, вообще не понятно как она у вас работает...
Мы уже победили, просто это еще не так заметно...
Re[8]: MSSQL я в восторге :)
От: Mikst  
Дата: 21.10.05 12:55
Оценка:
Здравствуйте, Merle, Вы писали:

M>Здравствуйте, Mikst, Вы писали:


M>>

M>>В свете всего вышеописанного почетной обязанностью разработчика является сведение вероятности мертвой блокировки к минимуму, а в идеале – к нулю, что является достаточно сложной, но вполне разрешимой задачей

M>(C)
M>Ну легкой жизни никто не обещал...
M>Насколько я понимаю, Вы просто взяли оракловую базу и подняли ее в сиквеле, ясен байт, что при таком подходе не то что дедлоки, вообще не понятно как она у вас работает...

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

пытаюсь понять что делаю не так:

Выдержка из статьи

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

SELECT @Var = Y FROM Tbl WITH (UPDLOCK) WHERE X = 2



делаю следующее:


первая сессия
begin tran 
select * from test with (UPDLOCK) where i=2;
update test set v=v+1 where i=2;
commit;



вторая сессия

select * from test where i=2;





в первой выполняю строки 1 и 2. запускаю вторую — все, курим хотя по смыслу и по описанию не должны.

Вобщем-то неважно курит в данном случае второй читающий процесс или нет, важно то что при этом дэдлока не произойдет, и апдейт нормально отработает. Все лучше 5 сек ждать, чем получить пустой лист из-за отката транзакции.
Re[9]: MSSQL я в восторге :)
От: Merle Австрия http://rsdn.ru
Дата: 21.10.05 13:23
Оценка:
Здравствуйте, Mikst, Вы писали:

M>в первой выполняю строки 1 и 2. запускаю вторую — все, курим хотя по смыслу и по описанию не должны.

Должны, и по смыслу и по описанию...

Вторая транзакция не будет курить если она успела проскочить между select ... WITH(UPDLOCK) и собственно update... А если не успела — то все, баста карапузики, update наложил свою честную X блокировку, которая никакому select-у дальше двигаться не даст.
Мы уже победили, просто это еще не так заметно...
Re[10]: MSSQL я в восторге :)
От: Mikst  
Дата: 21.10.05 13:31
Оценка:
Здравствуйте, Merle, Вы писали:

M>Здравствуйте, Mikst, Вы писали:


M>>в первой выполняю строки 1 и 2. запускаю вторую — все, курим хотя по смыслу и по описанию не должны.

M>Должны, и по смыслу и по описанию...

M>Вторая транзакция не будет курить если она успела проскочить между select ... WITH(UPDLOCK) и собственно update... А если не успела — то все, баста карапузики, update наложил свою честную X блокировку, которая никакому select-у дальше двигаться не даст.


Так я же и говорю, я выполнил только часть

begin tran 
select * from test with (UPDLOCK) where i=2;

и все, но вторая курит
Re[11]: MSSQL я в восторге :)
От: Merle Австрия http://rsdn.ru
Дата: 21.10.05 13:53
Оценка:
Здравствуйте, Mikst, Вы писали:

M>Так я же и говорю, я выполнил только часть

M>
M>begin tran 
M>select * from test with (UPDLOCK) where i=2;
M>

M>и все, но вторая курит
Либо у Вас не MSSQL, и не DB2 и даже не Sybase, а какой-то совершенно не известный мне сервер..
Либо select из второй транзакции пытается сразу наложить табличную блокировку на всю таблицу, вместо того, чтобы блокировать строки по одной. Такое может быть, если оный select выполняется с уровнем изоляции Serializable и в таблице нет подходящих индексов, чтобы использовать Key Range Lock, поэтому приходится блокировать всю таблицу. Или же, если select выполняется с уровнем изоляции Repeatable Read и выше, и сервер решает, что блокируя записи по одной придется удерживать слишком много блокировок. Ну или у Вас там нарошный хинт затерялся, такой что select таблицу целиком пытается блокировать...
Больше вариантов нет.
... << RSDN@Home 1.1.4 beta 7 rev. 0>>
Мы уже победили, просто это еще не так заметно...
Re[12]: MSSQL я в восторге :)
От: Mikst  
Дата: 21.10.05 14:00
Оценка:
Здравствуйте, Merle, Вы писали:

M>Здравствуйте, Mikst, Вы писали:


M>>Так я же и говорю, я выполнил только часть

M>>
M>>begin tran 
M>>select * from test with (UPDLOCK) where i=2;
M>>

M>>и все, но вторая курит
M>Либо у Вас не MSSQL, и не DB2 и даже не Sybase, а какой-то совершенно не известный мне сервер..
M>Либо select из второй транзакции пытается сразу наложить табличную блокировку на всю таблицу, вместо того, чтобы блокировать строки по одной. Такое может быть, если оный select выполняется с уровнем изоляции Serializable и в таблице нет подходящих индексов, чтобы использовать Key Range Lock, поэтому приходится блокировать всю таблицу. Или же, если select выполняется с уровнем изоляции Repeatable Read и выше, и сервер решает, что блокируя записи по одной придется удерживать слишком много блокировок. Ну или у Вас там нарошный хинт затерялся, такой что select таблицу целиком пытается блокировать...
M>Больше вариантов нет.

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

сейчас выполнил (полностью) такой код

set transaction ISOLATION LEVEL SERIALIZABLE
begin tran 
select * from test with (UPDLOCK) where i=2;
--update test set v=v+1 where i=2;
--commit;


второй

select * from test where i=2; - задумался
select * from test where i=3; - задумался
select * from test where i=4; - задумался
select * from test where i=Х; - задумался при любом Х



дурдом
Re[13]: MSSQL я в восторге :)
От: Mikst  
Дата: 21.10.05 14:04
Оценка:
Здравствуйте, Mikst, Вы писали:

M>сейчас выполнил (полностью) такой код


M>
M>set transaction ISOLATION LEVEL SERIALIZABLE

Конечно READ COMMITTED

M>begin tran 
M>select * from test with (UPDLOCK) where i=2;
M>--update test set v=v+1 where i=2;
M>--commit;
M>


M>второй


и тут вначале было set transaction ISOLATION LEVEL READ COMMITTED

M>
M>select * from test where i=2; - задумался
M>select * from test where i=3; - задумался
M>select * from test where i=4; - задумался
M>select * from test where i=Х; - задумался при любом Х
M>


M>

M>дурдом
Re[2]: MSSQL я в восторге :)
От: IID Россия  
Дата: 21.10.05 14:20
Оценка:
Здравствуйте, pkarklin, Вы писали:

P>Почитайте: В блокировочнике никогда нельзя быть уверенным за правильность отчета ?!


С интересом проситал весь тред. Заметил инетересную вещь: на MSSQL наезжают по-поводу {1} блокировок при чтении, за отсутствие снапшотов (многие адепты MSSQL предложили их эмуляцию разными способами). Превереженцы MSSQL отбиваются примером {2}одновременного удаления/изменения большого количества записей в Oracle внутри одной транзакции. Разрешение этих проблем допустимо в обоих случаях, но, пользуясь терминологией sql.ru, заставляет разработчика "поприседать"

И у меня возник вопрос: в повседневной работе с БД (не специализированной БД вроде сбора инфы с железок, а среднестатистической БД использующейся в целях автоматизации предприятия: бухучёт, торговля, производство и т.д.) какого рода транзакции, {1} или {2} встречаются чаще ?

ИМХО, я вижу ситуацию глазами человека, работающего с Oracle. И мне сложности при чтении большого количества данных (отчёты) представляются несколько чрезмерными. Кстати, я понимаю искреннее недоумение людей, сталкивающихся с MSSQL после Oracle.

P.S.: огромная просьба не отвечать в стиле "кривые руки, система должна быть спроектирована по другому" и ему подобном.
kalsarikännit
Re[13]: MSSQL я в восторге :)
От: Merle Австрия http://rsdn.ru
Дата: 21.10.05 14:21
Оценка:
Здравствуйте, Mikst, Вы писали:

M>сейчас выполнил (полностью) такой код

M>set transaction ISOLATION LEVEL SERIALIZABLE
Если так, то это нормально... Это приведет к привентивному наложению X блокировки на всю таблицу, если нет подходящих индексов, так что ничего удивительного...
... << RSDN@Home 1.1.4 beta 7 rev. 0>>
Мы уже победили, просто это еще не так заметно...
Re[14]: MSSQL я в восторге :)
От: Merle Австрия http://rsdn.ru
Дата: 21.10.05 14:21
Оценка:
Здравствуйте, Mikst, Вы писали:


M>Конечно READ COMMITTED

M>>begin tran
M>>select * from test with (UPDLOCK) where i=2;

M>и тут вначале было set transaction ISOLATION LEVEL READ COMMITTED


M>>
M>>select * from test where i=2; - задумался
M>>select * from test where i=3; - задумался
M>>select * from test where i=4; - задумался
M>>select * from test where i=Х; - задумался при любом Х
M>>

А вот такого не может быть... Либо что-то не совсем так, как Вы описываете...
... << RSDN@Home 1.1.4 beta 7 rev. 0>>
Мы уже победили, просто это еще не так заметно...
Re[3]: MSSQL я в восторге :)
От: Merle Австрия http://rsdn.ru
Дата: 21.10.05 14:33
Оценка:
Здравствуйте, IID, Вы писали:

IID> Кстати, я понимаю искреннее недоумение людей, сталкивающихся с MSSQL после Oracle.

А я понимаю искреннее недоумение людей сталкивающихся с Ораклом после MSSQL.

IID>P.S.: огромная просьба не отвечать в стиле "кривые руки, система должна быть спроектирована по другому" и ему подобном.

А в каком стиле еще отвечать, если правильный ответ именно такой? В этих серверах действительно принципиально разный подход к проектированию баз и работе с данными. И спорить какой лучше, а какой хуже и какой чаще встречается — совершенно не интересно.
... << RSDN@Home 1.1.4 beta 7 rev. 0>>
Мы уже победили, просто это еще не так заметно...
Re[4]: MSSQL я в восторге :)
От: Mikst  
Дата: 21.10.05 15:04
Оценка:
Здравствуйте, Merle, Вы писали:

M>Здравствуйте, IID, Вы писали:


IID>> Кстати, я понимаю искреннее недоумение людей, сталкивающихся с MSSQL после Oracle.

M>А я понимаю искреннее недоумение людей сталкивающихся с Ораклом после MSSQL.

IID>>P.S.: огромная просьба не отвечать в стиле "кривые руки, система должна быть спроектирована по другому" и ему подобном.

M>А в каком стиле еще отвечать, если правильный ответ именно такой? В этих серверах действительно принципиально разный подход к проектированию баз и работе с данными. И спорить какой лучше, а какой хуже и какой чаще встречается — совершенно не интересно.

Он конечно разный, но! почему в оракле: "сел и сделал, и все жужжит". а в МС "сел сделал и все ждет"

Кстати полностью согласен с IID по поводу примеров, и того что чаще.

Хочется простого — обясните на пальцах, как в МС просто, без извратов делать нормальные многозадачные приложения. а то ей богу вспоминается анек про "обожди сынку, дискетку только отформатирую"

стати, читаю тред: здесь там в середине есть пример


create table TMP (id int); 
--В начале таблица пустая. 

--транзакция 1: 

DELETE from TMP WHERE id IN (1,2) ; 
INSERT INTO TMP (id) VALUES (1); 

--транзакция 2: 

DELETE from TMP WHERE id IN (1,2) ; 
INSERT INTO TMP (id) VALUES (2); 
COMMIT; 

--транзакция 1: 
COMMIT;


и коментарий:

разница лишь в том что когда пыль усядется, в Оракле будет в принципе неправильный результат, а МС не даст второй транзакции зеленый свет пока не кончится первая транзакция.
Если тебе нужен правильный результат в оракле — тебе не останется ничего другого как заблокировать всю таблицу, целиком и полностью — в Оракле нет предикатных блокировок.


специально провел этот тест, естественно в оракле получил строки 1 и 2, в МС только 2.

но по мне этот пример ничего не доказывает, кроме как то, что в МС все апдейты выполняются по очереди...
А если переделать пример так:

create table TMP (id int); 
--В начале таблица пустая. 

--транзакция 1: 

DELETE from TMP WHERE id IN (1,2) ; 

--транзакция 2: 

DELETE from TMP WHERE id IN (1,2) ; 
INSERT INTO TMP (id) VALUES (2); 
COMMIT; 

--транзакция 1: 
INSERT INTO TMP (id) VALUES (1); 
COMMIT;


то какой правильный ответ?
Re[4]: MSSQL я в восторге :)
От: IID Россия  
Дата: 21.10.05 15:07
Оценка:
Здравствуйте, Merle, Вы писали:

M>Здравствуйте, IID, Вы писали:


IID>> Кстати, я понимаю искреннее недоумение людей, сталкивающихся с MSSQL после Oracle.

M>А я понимаю искреннее недоумение людей сталкивающихся с Ораклом после MSSQL.

IID>>P.S.: огромная просьба не отвечать в стиле "кривые руки, система должна быть спроектирована по другому" и ему подобном.

M>А в каком стиле еще отвечать, если правильный ответ именно такой? В этих серверах действительно принципиально разный подход к проектированию баз и работе с данными. И спорить какой лучше, а какой хуже и какой чаще встречается — совершенно не интересно.

я не просил сравнивать какой из серверов лучше или хуже или чаще встречается. Специально даже подчеркнул, что в обоих серверах любые проблемы решаемы.
вопрос жа был такой:

в повседневной работе среднестатистической БД использующейся в целях автоматизации предприятия какого рода транзакции, {1} или {2} встречаются чаще ?
kalsarikännit
Re[5]: MSSQL я в восторге :)
От: Merle Австрия http://rsdn.ru
Дата: 21.10.05 18:16
Оценка:
Здравствуйте, Mikst, Вы писали:

M>Он конечно разный, но! почему в оракле: "сел и сделал, и все жужжит". а в МС "сел сделал и все ждет"

Я в MSSQL сделал и все жужжит, что я делаю не так?

M>Хочется простого — обясните на пальцах, как в МС просто, без извратов делать нормальные многозадачные приложения. а то ей богу вспоминается анек про "обожди сынку, дискетку только отформатирую"

Сколько Вы учились на оракле грамотно писать? А тут хотите сразу и на пальцах? Чудес не бывает...

M>стати, читаю тред: здесь там в середине есть пример

Правильный пример...

M>но по мне этот пример ничего не доказывает, кроме как то, что в МС все апдейты выполняются по очереди...

Этот пример доказывает, что если транзакции выполнять не по очереди, то получится неправильныйц результат.
Если же абстрагироваться от очередности, то мне пофиг как там транзакции выполняются, главное чтобы результат был правильный, а оракл такого без дополнительных приседаний не гарантирует.
Эта тема здесь поднимается с завидной регулярностью, надоела уже хуже бухгалтерии...

M>А если переделать пример так:

...
M>то какой правильный ответ?
Правильный ответ заключается в том, чтобы в таблице было только одно число или 1 или 2, но ни как ни оба одновременно. Любой результат при котором в таблице окажется больше 1й записи будет нарушением условия задачи.
... << RSDN@Home 1.1.4 beta 6a rev. 0>>
Мы уже победили, просто это еще не так заметно...
Re[6]: MSSQL я в восторге :)
От: Merle Австрия http://rsdn.ru
Дата: 21.10.05 18:16
Оценка:
Здравствуйте, Mikst, Вы писали:

M>Очень даже занятный пример, его автор хочет показать что оракл делает "неправильно", но получается то наоборот.

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

M>первая завершаясь добавляет в базу свою строчку 1, а то что делит второй не смог это удалить — ну так правильно, нечего на тот момент удалять то было .

И получилось, что вторая транзакция увидела только часть изменений произведенных первой — налицо нарушение изолированности транзакций..
Задача формулируется так: "при любом выполнении этих транзакций в таблице должна быть только одна запись". И в версионниках, в отличии от блокировочников, возможны сценарии при которых это условие нарушается.

Вот еще один пример...
Допустим бизнес-логика требует, чтобы x+y<5, на данный момент x=1 и y=1, далее псевдокод:
-- для всех транзакций
SET TRANSACTION ISOLATION LEVEL SNAPSHOT

-- транзакция 1 (T1)
--
SELECT (X, Y)

-- надо добавить к X два, 
-- проверяем, что X + 2 + Y < 5
--
IF ((X + 2) + Y < 5) -- все в порядке Y(=1) + X(=1+2)<5
    UPDATE SET X=X+2

-- в этот момент стартует вторая транзакция (Т2)
-- которой, в свою очередь, надо к Y добавить 2, естественно с проверкой.
--
SELECT (X, Y)

IF (X + (Y + 2) < 5) -- тоже все в порядке Y(=1+2) + X(=1)<5
    UPDATE SET Y=Y+2 -- так как SELECT(X, Y) выбрал последнюю 
                     -- зафиксированную версию X (=1)

-- ну и фиксируем обе транзакции в произвольном порядке.
-- 
COMMIT    -- T1

COMMIT    -- T2


В многоверсионной истории это выглядит примерно так:
R1(x,y),W1(x),R2(x,y),W2(y),C1..,C2
Как нетрудно догадаться, в результате этих упражнений X+Y будет равно 6, что не соответствует никакому сценарию последовательного выполнения, налицо нарушение изолированности транзакций.
... << RSDN@Home 1.1.4 beta 6a rev. 0>>
Мы уже победили, просто это еще не так заметно...
Re[5]: MSSQL я в восторге :)
От: Merle Австрия http://rsdn.ru
Дата: 21.10.05 18:16
Оценка:
Здравствуйте, IID, Вы писали:

IID>вопрос жа был такой:

Ответ был "Вопрос неверный".

IID>в повседневной работе среднестатистической БД использующейся в целях автоматизации предприятия какого рода транзакции, {1} или {2} встречаются чаще ?

"Ты прекратила пить коньяк по утрам?" (С)
Ввиду того что разработчики блокировочников не встречаются с проблемами при решении задач 1, равно как и разработчики версионников при решении задач 2, то делать какие-либо выводы на основе частоты встречания этих задач смысла не имеет.
... << RSDN@Home 1.1.4 beta 6a rev. 0>>
Мы уже победили, просто это еще не так заметно...
Re[6]: MSSQL я в восторге :)
От: Mikst  
Дата: 24.10.05 06:53
Оценка:
Здравствуйте, Merle, Вы писали:

M>Здравствуйте, IID, Вы писали:


IID>>вопрос жа был такой:

M>Ответ был "Вопрос неверный".

IID>>в повседневной работе среднестатистической БД использующейся в целях автоматизации предприятия какого рода транзакции, {1} или {2} встречаются чаще ?

M>"Ты прекратила пить коньяк по утрам?" (С)
M>Ввиду того что разработчики блокировочников не встречаются с проблемами при решении задач 1,

Вот я встретился и никто не может сказать как решить проблем...
Re[7]: MSSQL я в восторге :)
От: Mikst  
Дата: 24.10.05 06:55
Оценка:
Здравствуйте, Merle, Вы писали:

M>Здравствуйте, Mikst, Вы писали:


M>>Очень даже занятный пример, его автор хочет показать что оракл делает "неправильно", но получается то наоборот.

M>Пример показывает ровно то, что должен. Оракл не гарантирует изолированности транзакций при любом уровне изоляции...

M>>первая завершаясь добавляет в базу свою строчку 1, а то что делит второй не смог это удалить — ну так правильно, нечего на тот момент удалять то было .

M>И получилось, что вторая транзакция увидела только часть изменений произведенных первой — налицо нарушение изолированности транзакций..
M>Задача формулируется так: "при любом выполнении этих транзакций в таблице должна быть только одна запись". И в версионниках, в отличии от блокировочников, возможны сценарии при которых это условие нарушается.

M>Вот еще один пример...

M>Допустим бизнес-логика требует, чтобы x+y<5, на данный момент x=1 и y=1, далее псевдокод:
M>
M>-- для всех транзакций
M>SET TRANSACTION ISOLATION LEVEL SNAPSHOT

M>-- транзакция 1 (T1)
M>--
M>SELECT (X, Y)

M>-- надо добавить к X два, 
M>-- проверяем, что X + 2 + Y < 5
M>--
M>IF ((X + 2) + Y < 5) -- все в порядке Y(=1) + X(=1+2)<5
M>    UPDATE SET X=X+2

M>-- в этот момент стартует вторая транзакция (Т2)
M>-- которой, в свою очередь, надо к Y добавить 2, естественно с проверкой.
M>--
M>SELECT (X, Y)

M>IF (X + (Y + 2) < 5) -- тоже все в порядке Y(=1+2) + X(=1)<5
M>    UPDATE SET Y=Y+2 -- так как SELECT(X, Y) выбрал последнюю 
M>                     -- зафиксированную версию X (=1)

M>-- ну и фиксируем обе транзакции в произвольном порядке.
M>-- 
M>COMMIT    -- T1

M>COMMIT    -- T2
M>


M>В многоверсионной истории это выглядит примерно так:

M>R1(x,y),W1(x),R2(x,y),W2(y),C1..,C2
M>Как нетрудно догадаться, в результате этих упражнений X+Y будет равно 6, что не соответствует никакому сценарию последовательного выполнения, налицо нарушение изолированности транзакций.

Мое резюме здесь
Автор: Mikst
Дата: 24.10.05
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.