Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: потерянные изменения\обновления  [new]
ivanmipt
Member

Откуда: МФТИ
Сообщений: 101
Тем не менее, кому еще не надоело приведите, пожалуйста, свои определения (как можно более однозначные) явления lost update и действительно ли можно его наблюдать в рамках СУБД а не приложений, причем я прошу всех, т.к. думаю что чем больше вариантов, тем лучше, возможно мы все вместе узнаем много нового ;)
29 авг 12, 23:27    [13085911]     Ответить | Цитировать Сообщить модератору
 Re: потерянные изменения\обновления  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
ivanmipt
Осуществляю коннект от двух пользователей от каждого пишу скрипт с простеньким (до безобразия) апдейтом, затем запускаю сначала одну потом другую и коммичу (коммитю) также сначала одну, потом другую, как и ожидалось всё что натворила первая транзакция затерлось.

На MSSQL вы вряд ли смогли такое осуществить.
ivanmipt
Тем не менее, кому еще не надоело приведите, пожалуйста, свои определения (как можно более однозначные) явления lost update и действительно ли можно его наблюдать в рамках СУБД а не приложений, причем я прошу всех, т.к. думаю что чем больше вариантов, тем лучше, возможно мы все вместе узнаем много нового ;)
Сами же привели ссылку на статью из википедии. Что там непонятного и неоднозначного?

Вы вообще какую-то конкретную задачу хотите решить или просто так интересуетесь?
30 авг 12, 00:14    [13086059]     Ответить | Цитировать Сообщить модератору
 Re: потерянные изменения\обновления  [new]
ivanmipt
Member

Откуда: МФТИ
Сообщений: 101
invm,

я хочу увидеть явление lost update, это в принципе достаточно конкретная задача (если знать точно определение этого явления конечно)

да привел ссылку на статью из википедии, но мне всё же не совсем ясно что там имеют ввиду, т.е. там подразумевают, что апдейт второй транзакции уже затирает апдейт первой и коммит первой фиксирует изменения которые на самом деле сделала вторая транзакция, а коммит второй это по сути контрольный в голову для первой транзакции?? Или я не верно понял??

Ну у меня получилось запустить две транзакции одна из которых точно блокировала другую (я в этом если не на 100% то на 98,5 уж точно уверен). К тому же пример с грязным чтением из той же википедии прокатывает в MSSQL на ура.
30 авг 12, 00:28    [13086083]     Ответить | Цитировать Сообщить модератору
 Re: потерянные изменения\обновления  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
ivanmipt
я хочу увидеть явление lost update, это в принципе достаточно конкретная задача (если знать точно определение этого явления конечно)
Это не задача, это любопытство ;-)
ivanmipt
да привел ссылку на статью из википедии, но мне всё же не совсем ясно что там имеют ввиду, т.е. там подразумевают, что апдейт второй транзакции уже затирает апдейт первой и коммит первой фиксирует изменения которые на самом деле сделала вторая транзакция, а коммит второй это по сути контрольный в голову для первой транзакции?? Или я не верно понял??
Есть уровень изоляции Lost updates, а есть эффект параллелизма Lost updates:
http://http://msdn.microsoft.com/en-us/library/ms378149.aspx
Transactions must be run at an isolation level of at least repeatable read to prevent lost updates that can occur when two transactions each retrieve the same row, and then later update the row based on the originally retrieved values. If the two transactions update rows using a single UPDATE statement and do not base the update on the previously retrieved values, lost updates cannot occur at the default isolation level of read committed.
Вас что именно интересует?
ivanmipt
Ну у меня получилось запустить две транзакции одна из которых точно блокировала другую (я в этом если не на 100% то на 98,5 уж точно уверен). К тому же пример с грязным чтением из той же википедии прокатывает в MSSQL на ура.
Именно так и должно быть. Т.к. из той же статьи
Choosing a transaction isolation level does not affect the locks that are acquired to protect data modifications. A transaction always gets an exclusive lock on any data it modifies and holds that lock until the transaction completes, regardless of the isolation level set for that transaction. For read operations, transaction isolation levels primarily define the level of protection from the effects of modifications made by other transactions.
Ну и грязное чтение тут совсем не при чем.
30 авг 12, 01:22    [13086181]     Ответить | Цитировать Сообщить модератору
 Re: потерянные изменения\обновления  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
ivanmipt
да привел ссылку на статью из википедии, но мне всё же не совсем ясно что там имеют ввиду, т.е. там подразумевают, что апдейт второй транзакции уже затирает апдейт первой и коммит первой фиксирует изменения которые на самом деле сделала вторая транзакция, а коммит второй это по сути контрольный в голову для первой транзакции?? Или я не верно понял??
Да там в общем понятно расписано, что имеется в виду. Только непонятно, существуют ли реальные СУБД с таким поведением.

В этой же вики есть ссылка на статью в BOL; там написано, что у MSSQL возможность lost update не реализованна при любых уровнях изоляции.
ivanmipt
К тому же пример с грязным чтением из той же википедии прокатывает в MSSQL на ура.
Ну вот, грязное чтение реализовали, а грязное обновление нет, как говорится, бай дизайн.

Если интересна такая возможность, ищите в других СУБД.
30 авг 12, 10:07    [13086746]     Ответить | Цитировать Сообщить модератору
 Re: потерянные изменения\обновления  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
invm, а вы уверены что правильно поняли что пишется в педивикии?
invm
уровень изоляции Lost updates
Вы издеваетесь. Это "эффект", а не уровень изоляции.
Он возникает на READ COMMITED и READ UNCOMMITED
На REPATABLE READ и SERIALIZABLE (а также SNAPSHOT) его нет, и приводит либо к конфликту (DeadLock) или к локировке (одного ресурса другим, если поставить UpdLock на SELECT).

А что такое "Lost updates" - это непонимание физики процессов или кривые руки.
30 авг 12, 10:27    [13086841]     Ответить | Цитировать Сообщить модератору
 Re: потерянные изменения\обновления  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Я согласен с тем что оно двояко понимается и что не должно быть в вики симулякров.
30 авг 12, 10:28    [13086851]     Ответить | Цитировать Сообщить модератору
 Re: потерянные изменения\обновления  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Mnior
Я согласен с тем что оно двояко понимается и что не должно быть в вики симулякров.
На буржуйской, как я понял, данного "феномена" нет.
30 авг 12, 10:35    [13086885]     Ответить | Цитировать Сообщить модератору
 Re: потерянные изменения\обновления  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Mnior,

Именно поэтому я и спросил ТСа -- что его интересует уровень изоляции или "эффект".
30 авг 12, 10:40    [13086931]     Ответить | Цитировать Сообщить модератору
 Re: потерянные изменения\обновления  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
alexeyvg
а грязное обновление нет, как говорится, бай дизайн
В том-то и сыр бор.
Грязного обновления нет, но это не тоже самое что и "lost update".

Проблема в том что "эффекты" это не проблемы "уровня изоляции", это проблемы понимания недопрограммистом физики процессов. А как мы знаем, количества быдла гуманитариев возомнивших себя великими кулхацкерами в IT, чуть менее чем полностью, то данные "феномены" должны быть "просвящены в народ".

Для упрощения понимания, буржуи пресекли недопонимае срезав сразу по понятиям "Read phenomena". В котором естественно "lost update" скатился в обычный "Non-repeatable reads".
И ни о каких проблемах Write даже не упоминается, т.к. их в СУБД быть не может, ибо не может быть никогда, и главное - от греха подальше. Но истенный русский анонимус добавил в педивикию видимо для лулзов.
30 авг 12, 10:50    [13086988]     Ответить | Цитировать Сообщить модератору
 Re: потерянные изменения\обновления  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Mnior,

http://technet.microsoft.com/en-us/library/cc546518.aspx
Lost Update

A lost update can be interpreted in one of two ways. In the first scenario, a lost update is considered to have taken place when data that has been updated by one transaction is overwritten by another transaction, before the first transaction is either committed or rolled back. This type of lost update cannot occur in SQL Server 2005 because it is not allowed under any transaction isolation level.

The other interpretation of a lost update is when one transaction (Transaction #1) reads data into its local memory, and then another transaction (Transaction #2) changes this data and commits its change. After this, Transaction #1 updates the same data based on what it read into memory before Transaction #2 was executed. In this case, the update performed by Transaction #2 can be considered a lost update.
30 авг 12, 11:23    [13087240]     Ответить | Цитировать Сообщить модератору
 Re: потерянные изменения\обновления  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
invm, ну хоть там расписано более не менее.
30 авг 12, 11:43    [13087421]     Ответить | Цитировать Сообщить модератору
 Re: потерянные изменения\обновления  [new]
ivanmipt
Member

Откуда: МФТИ
Сообщений: 101
Ага вот эта последняя цитата попонятнее.. Т.е. когда меня спросят что такое lost update (или я сам себя спрошу) я могу вспомнить об этом тексте и жить со спокойной душой?

Меня правда немного смущает, что данное явление (эффект параллелизма) однозначно (а точнее двузначно) делкларируется в документации microsoft а не в каком-то более общем ресурсе.

Кстати я (не будь дураком) повесил аналогичную тему на форуме Oracle, где мне вчера описали lost update именно как второй вариант описанный в цитате и на сервере Oracle он вполне реализовался, но из-за того, что он нифига не вязался с тем что написано исключительно для лулзов в Википедии, решил что это не совсем полная информация и в результате сегодня получил куда более общее определение из достоверного источника :)
30 авг 12, 11:53    [13087512]     Ответить | Цитировать Сообщить модератору
 Re: потерянные изменения\обновления  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Вы меня извините, но мне лень Вику исправлять.
30 авг 12, 11:59    [13087567]     Ответить | Цитировать Сообщить модератору
 Re: потерянные изменения\обновления  [new]
ivanmipt
Member

Откуда: МФТИ
Сообщений: 101
Ммм блин, сделайте это кто-нибудь:) это приведет к уменьшению количества ламерских вопросов вроде моего по этой теме и поможет многим (ну или немногим) людям. :)
30 авг 12, 12:03    [13087614]     Ответить | Цитировать Сообщить модератору
 Re: потерянные изменения\обновления  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
ivanmipt
Кстати я (не будь дураком) повесил аналогичную тему на форуме Oracle, где мне вчера описали lost update именно как второй вариант описанный в цитате и на сервере Oracle он вполне реализовался, но из-за того, что он нифига не вязался с тем что написано исключительно для лулзов в Википедии, решил что это не совсем полная информация и в результате сегодня получил куда более общее определение из достоверного источника :)
Ну на MSSQL вы тоже можете получить искомое:
Session1Session2
begin tran;begin tran;
declare @v int;declare @v int;
select @v = v from dbo.Table where i = 1;select @v = v from dbo.TestTable where i = 1;
update dbo.Table set v = @v + 1 where i = 1;
commit;
update dbo.Table set v = @v + 1 where i = 1;
commit;
В этом сценарии на
- read committed получите вожделенный lost update
- repeatable read получите deadlock
- serializable будет последовательное выполнение и корректный результат
- snapshot будет update conflict
30 авг 12, 12:32    [13087891]     Ответить | Цитировать Сообщить модератору
 Re: потерянные изменения\обновления  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
invm
Mnior,

http://technet.microsoft.com/en-us/library/cc546518.aspx
Lost Update

A lost update can be interpreted in one of two ways. In the first scenario, a lost update is considered to have taken place when data that has been updated by one transaction is overwritten by another transaction, before the first transaction is either committed or rolled back. This type of lost update cannot occur in SQL Server 2005 because it is not allowed under any transaction isolation level.

The other interpretation of a lost update is when one transaction (Transaction #1) reads data into its local memory, and then another transaction (Transaction #2) changes this data and commits its change. After this, Transaction #1 updates the same data based on what it read into memory before Transaction #2 was executed. In this case, the update performed by Transaction #2 can be considered a lost update.
Ну надо же, прямо как мой пост 13085335 :-)
30 авг 12, 12:35    [13087914]     Ответить | Цитировать Сообщить модератору
 Re: потерянные изменения\обновления  [new]
ivanmipt
Member

Откуда: МФТИ
Сообщений: 101
alexeyvg,

для меня то что это один в один ваш пост не так очевидно, уж простите :)

а вот то, что там понятно написано и из достоверного источника тут уж не поспоришь.
30 авг 12, 12:49    [13088039]     Ответить | Цитировать Сообщить модератору
 Re: потерянные изменения\обновления  [new]
ivanmipt
Member

Откуда: МФТИ
Сообщений: 101
invm,

Спасибо! Как раз собирался, что-то подобное реализовать в MS SQL server :)
30 авг 12, 12:51    [13088056]     Ответить | Цитировать Сообщить модератору
 Re: потерянные изменения\обновления  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
ivanmipt
Кстати я (не будь дураком) повесил аналогичную тему на форуме Oracle, где мне вчера описали lost update именно как второй вариант описанный в цитате и на сервере Oracle он вполне реализовался, но из-за того, что он нифига не вязался с тем что написано исключительно для лулзов в Википедии
Смешались кони, люди.
Всё-таки три (3) трактовки поведения. 3-тья также не не катит нигде.
В вики написано так:
SELECT f2 FROM tbl1 WHERE f1=1;
UPDATE tbl1 SET f2=f2+20 WHERE f1=1;
Хотя в интерпретации темы имелось ввиду это:
SELECT @f2 = f2 FROM tbl1 WHERE f1=1;
UPDATE tbl1 SET f2=@f2+20 WHERE f1=1;
В зависимости от уровня изоляции выражение SET f2=f2+20 будет работать по разному.

В режимах локировок или версионности уровня стейтмента f2 будет иметь значение на момент команды и соответственно будет изменено на оба изменения +20+25 -> +45 в конечном итоге.
При сессионной версионности f2 будет иметь значение на начало транзакции, и следовательно поле будет изменено на то значение которое прописано (+20 или +25), но при COMMIT будет ошибка и всё равно не сработает.
Т.е. никаких "Lost Update" такого (третьего) рода нет нигде, даже в Oracle.

Есть четыре комбины: пессимистическое/оптимистическое чтение/запись.
30 авг 12, 13:03    [13088184]     Ответить | Цитировать Сообщить модератору
 Re: потерянные изменения\обновления  [new]
ivanmipt
Member

Откуда: МФТИ
Сообщений: 101
Mnior,

да нет же, кони, люди на местах. Первоначально я интерпретировал тему вообще неверно и это был не лост апдейт, в вики имеют ввиду (ну это кажется наиболее вероятным) случай первой из документации microsoft т.е. когда вторая транзакция затирает апдейт первой и коммит первой фиксирует изменения уже не первой, а второй (как мы понял в ms sql server это не поддерживается).

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

не понимаю к чему замечание о смешении, lost update это эффект параллелизма а не фича какой-то конкретной СУБД. Попробуйте реализовать следующий сценарий на дефолтном уровне изоляции транзакции на Oracle вместе с коммитом и со всем таким прочим:

Bobby Z.
Предположим, tab.x = 25 where tab.id = 1, операции в хронологическом порядке.

T1: select x into var from tab where id=1
T2: select x into var from tab where id=1
T2: update tab set x = var + 10 where id=1
T2: commit
T1: update tab set x = var + 15 where id=1
T1: commit
30 авг 12, 14:06    [13088722]     Ответить | Цитировать Сообщить модератору
 Re: потерянные изменения\обновления  [new]
ivanmipt
Member

Откуда: МФТИ
Сообщений: 101
Если перерыв в транзакции T1 будет достаточно долгим вы сможете любоваться на свои данные в таблице хоть час хоть два хоть двадцать, но по окончании первой транзакции они затрутся и ничего с этим сделать нельзя и не будет никакой ошибки при коммите, даже не понятно с чего ей там быть, ибо ошибка на уровен serializable будет генериться за счет проверки scn страницы, где сохранена таблица и scn транзакции, но тут я говорю об Oracle. Я не знаю как всё это реализовано в MS SQL server.
30 авг 12, 14:15    [13088785]     Ответить | Цитировать Сообщить модератору
 Re: потерянные изменения\обновления  [new]
ivanmipt
Member

Откуда: МФТИ
Сообщений: 101
ivanmipt,

хотя если честно я не очень догнал что вы имеете ввиду по сессионной версионностью (я бы хотел чтобы вы это пояснили, если не сложно), но если вы выполните те две транзакции от имени разных пользователей в Oracle при обращении к одной и той же базе, то увидите lost update как я и описал.
30 авг 12, 14:18    [13088813]     Ответить | Цитировать Сообщить модератору
 Re: потерянные изменения\обновления  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
ivanmipt
что вы имеете ввиду по сессионной версионностью
Я не помню есть ли это у оракакла, у MS нету, т.к. изменения всегда локируются.
Так вот, это когда данные в таблах берутся на начало старта транзакции. Любые изменения не касаются реальных таблиц, т.е. не блокируется. Но при COMMIT изменения "применяются", если с начала старта все считанные строки не изменились параллельными процессами, иначе ошибка.
Это называется: пессимистические чтение, пессимистическая запись.
Вещь бесполезная. IMXO.
Возможно зря упомянул.

ivanmipt
не будет никакой ошибки
Нифига. Или будут локировки или дедлоки или ошибка.
Но вы не сможете добиться чтобы команда SET Field = Field + 20 (без переменной) успешно сработала и при этом значение Field было "старым" (т.е. его успешно изменили параллельно).
В основном будут или локировки и никаких потерь или заведомо кривой код и неправильные понимание что значит "потеря".
30 авг 12, 21:16    [13091689]     Ответить | Цитировать Сообщить модератору
 Re: потерянные изменения\обновления  [new]
ivanmipt
Member

Откуда: МФТИ
Сообщений: 101
Mnior,

Вобщем или поверьте мне на слово или напишите два скрипта и убедитесь сами, ну или мы просто друг друга не понимаем (скорее последнее) :)
30 авг 12, 22:14    [13091805]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить