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

Откуда: МФТИ
Сообщений: 101
Всем доброго времени суток!

Вобщем сразу к делу, имеется таблица EMP
id name
1 Tom
2 John
3 Peter


Хочу в MS SQL сервере посмотреть на такое явление как потерянные изменения и на его отсутствие при определенном уровне изоляции транзакции. Осуществляю коннект от двух пользователей от каждого пишу скрипт с простеньким (до безобразия) апдейтом, затем запускаю сначала одну потом другую и коммичу (коммитю) также сначала одну, потом другую, как и ожидалось всё что натворила первая транзакция затерлось. Трудность возникла когда решил обойти это явление повысив уровень изоляции обоих транзакций (да хоть до serializable). Я так понимаю, что результат должен быть в духе посылания второй транзакции куда подальше (какая-нибудь ошибка доступа) когда она пытается получить доступ к строке которая уже изменяется первой транзакцией, как это было бы в Оракле при использовании в транзакциях конструкции SELECT FOR UPDATE NOWAIT, или нет? Или просто должна быть блокировка и этого достаточно и это и есть отсутствие потерянного обновления? Но ведь после коммита первой вторая все равно получит доступ к строке и затрет изменения первой.. Вобщем я чего-то запутался с этим MS SQL сервером (оракл ван лав), можете растолковать, желательно с примерами??? :)
29 авг 12, 19:33    [13084934]     Ответить | Цитировать Сообщить модератору
 Re: Потерянные изменения\обновления  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
ivanmipt,

корень зла в
автор
.. простеньким (до безобразия) апдейтом..

в многопользовательской среде надо чутка посложнее его писать, чтобы не терять ничего
29 авг 12, 19:39    [13084978]     Ответить | Цитировать Сообщить модератору
 Re: Потерянные изменения\обновления  [new]
ivanmipt
Member

Откуда: МФТИ
Сообщений: 101
oraесли не сложно можно пример?
29 авг 12, 19:41    [13084991]     Ответить | Цитировать Сообщить модератору
 Re: Потерянные изменения\обновления  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
ivanmipt
oraесли не сложно можно пример?

update t set value=value+3 where id=123;
29 авг 12, 19:43    [13085006]     Ответить | Цитировать Сообщить модератору
 Re: Потерянные изменения\обновления  [new]
ivanmipt
Member

Откуда: МФТИ
Сообщений: 101
Просто немного не догоняю в чем разница, ведь две разные транзакции они и в африке две разные транзакции, да и блокировка осуществляется одной от другой, до фиксирования изменений.
29 авг 12, 19:44    [13085017]     Ответить | Цитировать Сообщить модератору
 Re: Потерянные изменения\обновления  [new]
ivanmipt
Member

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

да не ну это то ок, вот я ставлю уровень SET TRANSACTION ISOLATION LEVEL SERIALIZABLE GO BEGIN TRANSACTION.. и пошел поехал мой апдейт, должна вылетать ошибка при обращении к той же строке другой транзакции с таким же уровнем изоляции? или блокировка это максимум на что можно расчитывать, но как тогда избежать потерянных изменений (если я правильно понимаю что это, смотрел в книжке Тома Кайта и википедии, вроде понятно).
29 авг 12, 19:48    [13085032]     Ответить | Цитировать Сообщить модератору
 Re: Потерянные изменения\обновления  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
ivanmipt
orawish,

да не ну это то ок, вот я ставлю уровень SET TRANSACTION ISOLATION LEVEL SERIALIZABLE GO BEGIN TRANSACTION.. и пошел поехал мой апдейт, должна вылетать ошибка при обращении к той же строке другой транзакции с таким же уровнем изоляции? или блокировка это максимум на что можно расчитывать, но как тогда избежать потерянных изменений (если я правильно понимаю что это, смотрел в книжке Тома Кайта и википедии, вроде понятно).

select .. for update nowait
29 авг 12, 19:57    [13085068]     Ответить | Цитировать Сообщить модератору
 Re: Потерянные изменения\обновления  [new]
ivanmipt
Member

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

а уровни изолированности тут никак не помогут?? Т.е. они же и определяются через эти явления (грязное чтение, потерянное обновление, неповт. чтение, фантом) просто каждый след уровень, должен быть более жестким, а значит serializable должен точно ограничивать это потерянное изменение, я думал что его установка для транзакции приведет к ошибке, но сервер послал меня лесом, выполнил блокировку, подождал, пока освободится ресурс и затер изменения.
29 авг 12, 20:09    [13085117]     Ответить | Цитировать Сообщить модератору
 Re: Потерянные изменения\обновления  [new]
Bobby Z.
Member

Откуда: NJ USA
Сообщений: 351
ivanmipt
orawish,

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

Именно. Потому что перед изменением Вы не проверяете что Вы затираете.
Потерянное обновление (lost update) определяется следующим образом:
транзакция #1 считывает некоторые данные в память, потом транзакция #2
эти данные изменяет и фиксирует изменения, после чего транзакция #1 эти
же данные также изменяет, основываясь на ранее прочитанном и
сохраненном в своей памяти,
и фиксирует свои изменения. В этом
случае изменения, сделанные транзакцией #2 считаются потерянными.

То есть это некий весьма специфичный случай. Обычно демонстрируется
примером, когда два клерка обрабатывают поступление некоторых порций
одного и того же товара: первый получил, скажем, 10 единиц товара, а второй 15.
Оба смотрят сколько сейчас товара на складе. Оба видят 25. После этого первый
выставляет новое количество в 35 и фиксирует, потом второй выставляет его в 40
и тоже фиксирует. Изменения первого затерты, количество неверно.

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

Предположим, 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

на уровнях изоляции < repeatable read приведет к тому, что x
будет = 40; изменения, сделанные T2, потеряны.

При repeatable read T1 повесит блокировку на строку, запрещающую
ее изменение до окончания транзакции для обеспечения повторяемого
чтения, так что T2 на update "зависнет", T1 строку успешно обновит,
и после ее коммита T2 вылетит с нарушением уровня изоляции. Если

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 AND x = var
T2: commit
T1: update tab set x = var + 15 where id=1 AND x = var
T1: commit

то T1 не обновит ничего на Read Committed (но и ошибок не выдаст,) и какая-то
одна из двух транзакций обломается с нарушением уровня изоляции на repeatable
read и выше. Ну и, в принципе, очевидно, что update tab set x = x + N where id = 1
к потерянным обновлениям не приводит и при этом даже serializable не нарушает.
29 авг 12, 22:26    [13085718]     Ответить | Цитировать Сообщить модератору
 Re: Потерянные изменения\обновления  [new]
ivanmipt
Member

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

ого и в рамках субд это сработает?? ща проверю, просто мы с парнями на форуме MS SQL server вроде решили, что ни одна человеческая субд не поддерживает это явление ибо... ну вроде как sql92 запрещает.
29 авг 12, 22:34    [13085757]     Ответить | Цитировать Сообщить модератору
 Re: Потерянные изменения\обновления  [new]
ivanmipt
Member

Откуда: МФТИ
Сообщений: 101
хотя вряд ли я проверну такой хронологический порядок :)
29 авг 12, 22:39    [13085787]     Ответить | Цитировать Сообщить модератору
 Re: Потерянные изменения\обновления  [new]
Bobby Z.
Member

Откуда: NJ USA
Сообщений: 351
ivanmipt
Bobby Z.,

ого и в рамках субд это сработает?? ща проверю, просто мы с парнями на форуме MS SQL server вроде решили, что ни одна человеческая субд не поддерживает это явление ибо... ну вроде как sql92 запрещает.

Определений lost update, на самом деле, два - одно из них религия, да, явно запрещает. А второе - то, которое я привел. Часто встречается во всяких веб-приложениях: прочитали данные на форму, что-то там поменяли, все как есть загнали назад, не проверив, а не поменялось ли чего пока мы форму редактировали, в результате затерли изменения из другой такой же формы, которая успела раньше. Ну и на уровне read committed это тоже легко воспроизводимо.

И еще: Оракл repeatable read не поддерживает (читатели писателей в принципе не блокируют, а это необходимо для обеспечения repeatable read,) а вот на serializable отлавливает такие ситуации на раз.
29 авг 12, 23:22    [13085896]     Ответить | Цитировать Сообщить модератору
 Re: Потерянные изменения\обновления  [new]
ivanmipt
Member

Откуда: МФТИ
Сообщений: 101
блин не стоит у меня оракл на винде >.< в принципе это то можно проверить, заделав какой-нибудь более менее продолжительный цикл в блоке (ну мне так кажется), тогда можно выбрать отдельно и про апдейтить после другой транзакции.

вобщем не отключайтесь еще пол часика, я напишу результаты)
29 авг 12, 23:35    [13085936]     Ответить | Цитировать Сообщить модератору
 Re: Потерянные изменения\обновления  [new]
Bobby Z.
Member

Откуда: NJ USA
Сообщений: 351
ivanmipt,

Две сессии sqlplus в двух разных окнах не канают? ;)
29 авг 12, 23:47    [13085971]     Ответить | Цитировать Сообщить модератору
 Re: Потерянные изменения\обновления  [new]
ivanmipt
Member

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

действительно на дефолтном read commited мы имеем потерянные изменения, а вот на serializable у нас после выполнения второй транзакции для первой вылетает исключение "can't serialize acess to this transaction".. короче говоря спасибо от души))

Сообщение было отредактировано: 30 авг 12, 09:15
30 авг 12, 00:14    [13086056]     Ответить | Цитировать Сообщить модератору
 Re: Потерянные изменения\обновления  [new]
ivanmipt
Member

Откуда: МФТИ
Сообщений: 101
правда это уже идет по сути pl/sql интересно можно ли то же самое провернуть в рамках простого sql и действительно ли это TOT CAMЫЙ LOST UPDATE о котором все говорят...
30 авг 12, 00:16    [13086065]     Ответить | Цитировать Сообщить модератору
 Re: Потерянные изменения\обновления  [new]
ivanmipt
Member

Откуда: МФТИ
Сообщений: 101
только вот почему-то вылетает с нарушением T1 наверное потому что select еще никаких ограничений не повесит, в отличие от update и первая транзакция заметит, что.. блин я даже представить боюсь что она заметит..., и в примере с низким уровнем изоляции последовательно будет блокировка-коммит для 2-й тр-ии и блокировка-коммит для 1-й тр-ии в такой последовательности блокировок ничего удивительного думаю нет, еще раз уточню это точно тот самый LOST UPDATE ?? блин то же грязное чтение понятнее в миллиард раз...
30 авг 12, 00:44    [13086110]     Ответить | Цитировать Сообщить модератору
 Re: Потерянные изменения\обновления  [new]
ivanmipt
Member

Откуда: МФТИ
Сообщений: 101
кстати отвлекаясь от lost update эта тема с вылетом первой транзакции действительно интересна, т.к. запускается она первой, дальше неблокирующее чтение, дальше запускаем вторую, неблокирующее чтение второй, блокировка строки апдейт строки второй транзакцией, попытка апдейта первой транзакцией нашей строки и её вылет с сообщением can't serialize acess for this transaction" т.е.
получается что при уровне изоляции serializable блокировки не снимаются никогда??? О_о

нет это точно неправда но выглядит это чертовски странно..
30 авг 12, 00:50    [13086124]     Ответить | Цитировать Сообщить модератору
 Re: Потерянные изменения\обновления  [new]
Bobby Z.
Member

Откуда: NJ USA
Сообщений: 351
ivanmipt,

Да точно, точно. Он самый. Других не придумали пока. :)
30 авг 12, 00:50    [13086126]     Ответить | Цитировать Сообщить модератору
 Re: Потерянные изменения\обновления  [new]
ivanmipt
Member

Откуда: МФТИ
Сообщений: 101
Можешь что-нибудь сказать по поводу вылета первой транзакции??
30 авг 12, 00:51    [13086132]     Ответить | Цитировать Сообщить модератору
 Re: Потерянные изменения\обновления  [new]
ivanmipt
Member

Откуда: МФТИ
Сообщений: 101
Теперь надо подумать как все это перенести на MS SQL server.......
30 авг 12, 00:55    [13086143]     Ответить | Цитировать Сообщить модератору
 Re: Потерянные изменения\обновления  [new]
Dimitry Sibiryakov
Member

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

ivanmipt
будет блокировка-коммит для 2-й тр-ии и блокировка-коммит для 1-й тр-ии

Не надо мыслить в терминах блокировочника. Не будет никаких блокировок. Будет неожидаемый
scn на странице при попытке записи изменений той транзакцией, которая не успела первой. И
это будет критерием для выброса "cannot serialize".

Posted via ActualForum NNTP Server 1.5

30 авг 12, 00:59    [13086151]     Ответить | Цитировать Сообщить модератору
 Re: Потерянные изменения\обновления  [new]
ivanmipt
Member

Откуда: МФТИ
Сообщений: 101
ммм, это всмысле что scn дважды проверится первой транзакцией первый раз в начале, а второй раз при попытке записи, транзакция увидит несовпадение и пойдет плясать?? или это не так работает?
30 авг 12, 01:03    [13086158]     Ответить | Цитировать Сообщить модератору
 Re: Потерянные изменения\обновления  [new]
Dimitry Sibiryakov
Member

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

ivanmipt
или это не так работает?

Проще это работает: scn страницы больше чем scn транзакции - отлуп. Всё, телемаркет.

Posted via ActualForum NNTP Server 1.5

30 авг 12, 01:11    [13086171]     Ответить | Цитировать Сообщить модератору
 Re: Потерянные изменения\обновления  [new]
ivanmipt
Member

Откуда: МФТИ
Сообщений: 101
хм круто придумано))
30 авг 12, 01:23    [13086183]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить