Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Блокировка таблицы
|
|||
|---|---|---|---|
|
#18+
Резко встала необходимость соорудить свой генератор Id'шек. Создана таблица Код: plaintext 1. 2. 3. 4. 5. стартуется транзакция генериться Id записываются данные с новорожденным Id commit И тут уже пару раз вылезло, что на один и тот же Id повесилось несколько разных данных Ж8-/ Скорее всего это произошло из-за того, что уровень изоляции транзакции select @@isolation 1 Transact-SQL User’s Guide Уровень 1 - Здесь предполагается, что в каждой транзакции считываются фактические данные, а не данные, записанные не окончившейся транзакцией. Другими словами, здесь не допускается считывание неподтвержденных данных. Этот уровень изоляции устанавливается по умолчанию SQL Сервером т.е. это READ_COMMITED. Выходит кто-то успел до commita транзакции в одном коннекте, считать данные в другом. А поскольку транзакция в первом коннекте еще не за'commit'чена, то и значение получено аналогичное. Отсюда вылезает, что надо блокировать таблицу, а еще лучше запись, а самый лучший вариант (если возможно) - поле. Поскольку субася - блокировочник, то, я так понимаю, при старте транзакции происходит блокирование. Только вот как и где можно указать что я хочу заблокировать: таблицу, запись, поле? select @@version Adaptive Server Enterprise/12.5.1/EBF 11428/P/NT (IX86)/OS 4.0/ase1251/1823/32-bit/OPT/Wed Sep 17 11:10:54 2003 _________________ "Helo, word!" - 17 errors 56 warnings ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2005, 13:57 |
|
||
|
Блокировка таблицы
|
|||
|---|---|---|---|
|
#18+
Так делаешь? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2005, 15:06 |
|
||
|
Блокировка таблицы
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. а в середине куча проверок - ежели чего - rollback _________________ "Helo, word!" - 17 errors 56 warnings ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2005, 15:23 |
|
||
|
Блокировка таблицы
|
|||
|---|---|---|---|
|
#18+
update этой твоей таблицы ключей и так блокирует твою запись до конца транзакции. От чтения тоже. Блокируется либо страница, либо запись, в зависимости от схемы блокировки твоей ключевой таблицы (IDS). Я бы кстати рекомендовал иметь ее на DOL , конкретно - на DRL. Изоляция транзакции тут ни при чем. Но если хочешь , можешь поставить именно у этого UPDATE-а at isolation 3 или 2. Хотя это, на сколько я могу сейчас сообразить, как ни странно, вообще ничего не поменяет. Я думаю, что скорее у тебя проблема с пониманием того, почему у тебя происходить повторное использование одного и того же ключа. Т.е. я думаю, что не из-за того, о чем ты думаешь, а из-за другого чего-то. Потому что делаешь ты все правильно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2005, 22:10 |
|
||
|
Блокировка таблицы
|
|||
|---|---|---|---|
|
#18+
Да я, вообще-то, всю жизнь просидел на IB/FB, а это - версионники. И для меня любое понятие вне контекста транзакции - нонсенс. А тут проект возник на субасе. Времени толком разбираться - нЭт Вот и разбираюсь в ньюансах субаси и, соответственно, блокировочника - от случая к случаю... Как правило - когда вылазят грабли... Из сказанного понял, что блокировку ставит не begin transaction, а следующий за ней update... Т.е.: если даже одновременно стартовали две транзакции, то выполнившая первой update и заблокирует? MasterZivОт чтения тоже.Гы... Кто бы мог подумать... А я думал что если уровень изоляции READ_COMMITED, то другие транзакции, 4 example, как в IB/FB, читать могут... MasterZivИзоляция транзакции тут ни при чем.В свете выше сказанного (что блокировка ставиться и на чтение) теперь это понятно... BTW, а можно ли тогда сделать, чтобы блокировалась только запись, а чтение было возможным? MasterZivБлокируется либо страница, либо запись, в зависимости от схемы блокировки твоей ключевой таблицы (IDS). Я бы кстати рекомендовал иметь ее на DOL , конкретно - на DRL.А где и как можно указать схему блокировки таблицы и что такое DOL и DRL? _________________ "Helo, word!" - 17 errors 56 warnings ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2005, 01:21 |
|
||
|
Блокировка таблицы
|
|||
|---|---|---|---|
|
#18+
Ex_Soft пишет: > Да я, вообще-то, всю жизнь просидел на IB/FB, а это - версионники. И для > меня любое понятие вне контекста транзакции - нонсенс. Надо было не только "просиживать" на IB/FB всю жизнь, а хотя бы изучить этот самый IB/FB. В нем тоже есть понятия вне контекста транзакции, не являющиеся нонсенсом. Например генераторы. А в FB еще кажется и внешние таблицы вне транзакций. > Из сказанного понял, что блокировку > ставит не begin transaction, а следующий за ней update... Т.е.: если > даже одновременно стартовали две транзакции, то выполнившая первой > update и заблокирует? Именно так. И, кстати, разве в FB не так в ситуации, когда две транзакции пытаются апдейтить одну и ту же запись? >> От чтения тоже. > Гы... Кто бы мог подумать... Любой, понимающий отличие блокировочника от версионника. > А я думал что если уровень изоляции > READ_COMMITED, то другие транзакции, 4 example, как в IB/FB, читать могут... А что они смогут читать, если старое значение уже изменено на новое, но оно еще не commited? (это утрированно, конечно) > В свете выше сказанного (что блокировка ставиться и на чтение) теперь > это понятно... BTW, а можно ли тогда сделать, чтобы блокировалась только > запись, а чтение было возможным? dirty read со всемы вытекающими последствиями. И, кстати, если не секрет, зачем понадобилось изобретать свой велосипед? Чем не устраивает identity в качестве генератора ID? Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2005, 02:03 |
|
||
|
Блокировка таблицы
|
|||
|---|---|---|---|
|
#18+
Александр ГoлдунИ, кстати, если не секрет, зачем понадобилось изобретать свой велосипед? Чем не устраивает identity в качестве генератора ID?Скорее всего потому что это попытка сэмулировать генератор. :) Ex_SoftДа я, вообще-то, всю жизнь просидел на IB/FBВ свое время, переводя проект с IB7 на ASA8 мне тоже пришлось решать такую задачу. К счастью, в ASA (с версии 8.0.1) есть функция GET_IDENTITY которая для таблицы с автоинкрементом резервирует одно или несколько значений ключа. Поэтому все решилось очень просто. :) Кстати говоря, похоже ASE один обделен такой возможностью. Не знаю насчет MSSQL, но в Oracle можно тоже делать выборку значения sequence.nextval для получения значения ключа заранее, до записи в базу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2005, 06:21 |
|
||
|
Блокировка таблицы
|
|||
|---|---|---|---|
|
#18+
Александр ГoлдунНапример генераторы...Совершенно справедливо. На то они и генераторы. Просто речь, как все поняли, шла именно в общем контексте версионной СУБД. Александр ГoлдунИ, кстати, разве в FB не так в ситуации, когда две транзакции пытаются апдейтить одну и ту же запись?Если очень интересно - Транзакции, архитектура IB Александр ГoлдунА что они смогут читать, если старое значение уже изменено на новое, но оно еще не commited?Речь шла не о том, что (какие данные) они могут считать, а о том что они вообще могут читать. Александр Гoлдунdirty read со всемы вытекающими последствиями.При чем тут уровень изоляции, когда MasterZivupdate этой твоей таблицы ключей и так блокирует твою запись до конца транзакции. От чтения тоже. Александр ГoлдунИ, кстати, если не секрет, зачем понадобилось изобретать свой велосипед? Чем не устраивает identity в качестве генератора ID?Не секрет ЭстЪ, 4 example, договор, выступающий в виде своего рода контейнера. И ЭстЪ документы входящие в него, 4 example - полисы. Ессесно, нумерация должна быть в контексте договора и непрерывная. Вариант генерить номера внутренних документов на ходу известен, рассматривался и не удовлетворил. Вот в двух словах... AndynСкорее всего потому что это попытка сэмулировать генератор.Абсолютно в дырочку И, исходя из быстрой и конструктивной реакции, - не я первый и, скорее всего, не я последний, занимающийся изобретением лисапета Тем более метод, который я использую, практически стал стандартом де-факто (просто иногда его ната немного обработать напильником в зависимости от особенностей СУБД) P.S. 2Александр Гoлдун А че Вы так на меня накинулись? На Вас подействовало упоминание об IB/FB как красная тряпка? BTW, из всех постов в данном топике только у вашего КПД нулевой. Его преспокойненько без ущерба можно перенести в ПТ . _________________ "Helo, word!" - 17 errors 56 warnings ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2005, 09:18 |
|
||
|
Блокировка таблицы
|
|||
|---|---|---|---|
|
#18+
Из сказанного понял, что блокировку ставит не begin transaction, а следующий за ней update... Т.е.: если даже одновременно стартовали две транзакции, то выполнившая первой update и заблокирует? ДА. MasterZivОт чтения тоже.Гы... Кто бы мог подумать... А я думал что если уровень изоляции READ_COMMITED, то другие транзакции, 4 example, как в IB/FB, читать могут... От так вот. Эт тебе не Интербаза. Тут фсе сирьёзна !! MasterZivИзоляция транзакции тут ни при чем. В свете выше сказанного (что блокировка ставиться и на чтение) теперь это понятно... BTW, а можно ли тогда сделать, чтобы блокировалась только запись, а чтение было возможным? Если говорить в общем - нет. Но есть нюансы. Например - блокировка на уровне полей, т.е. по идее если ты читаешь неизмененное поле, тебе дадут. А где и как можно указать схему блокировки таблицы и что такое DOL и DRL? sp_help TABLENAME вконце выдает схему блокирования. Всего бывают два вида и три типа блокирования. APL - all pages locking, классика. Блокируются страницы данных и страницы индексов. DOL - data only locked table Новая схема блокировки, появившаяся с 11.9. Блокируются только страницы или строки данных, индексы не блокируются на время транзакции никогда. DOL отличается от APL другой структурой хранения данных, и DOL бывает двух видов, (которые используют одну и ту же структуру данных) DPL data pages locking DRL data rows locking которые блокируют соответственно только страницы или только строки данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2005, 11:49 |
|
||
|
Блокировка таблицы
|
|||
|---|---|---|---|
|
#18+
MasterZivДА.А select заблокирует (если он будет после begin transaction, но перед DML(insert/update/delete))? Или это прерогатива только DML'я? MasterZivТут фсе сирьёзна !!Страшно аж жуть!!! MasterZivНо есть нюансы. Например - блокировка на уровне полей, т.е. по идее если ты читаешь неизмененное поле, тебе дадут.А как сие можно забалабенитЪ ? Так сказать для общего развтия и повышения вченности ... Ex_SoftА где и как можно указать схему блокировки таблицы refman2.pdf create table ... lock {datarows | datapages | allpages } Оно? _________________ "Helo, word!" - 17 errors 56 warnings ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2005, 12:58 |
|
||
|
Блокировка таблицы
|
|||
|---|---|---|---|
|
#18+
Ex_SoftАбсолютно в дырочку И, исходя из быстрой и конструктивной реакции, - не я первый и, скорее всего, не я последний, занимающийся изобретением лисапета Тем более метод, который я использую, практически стал стандартом де-факто (просто иногда его ната немного обработать напильником в зависимости от особенностей СУБД) В качестве варианта, при условии, что некритично иметь в каждой таблице значения ключа по порядку (типа 1,2,3 ...) то навскидку могу предложить: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Если не прав, знатоки ASE объяснят, что почем. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2005, 13:22 |
|
||
|
Блокировка таблицы
|
|||
|---|---|---|---|
|
#18+
Ex_Soft Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. а в середине куча проверок - ежели чего - rollback _________________ "Helo, word!" - 17 errors 56 warnings Получается, что пока один юзер не доделал свою транзакцию другие - идут покурить? А ты точно следишь за тем ГДЕ у тебя коммит/роллбак? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2005, 13:44 |
|
||
|
Блокировка таблицы
|
|||
|---|---|---|---|
|
#18+
Andynпри условии, что некритично иметь в каждой таблице значения ключа по порядку (типа 1,2,3 ...)Как раз критично ;) Согласитесь, если бы Вы получили договор в котором есть Полис N1, Полис N2, Полис N5, Полис N6, то Вы сразу бы забеспокоились на предмет наличия отсутствия Полис N3, Полис N4 ;) gardenmanПолучается, что пока один юзер не доделал свою транзакцию другие - идут покурить?Получается так... Но там внутри пару операторов - так, что они даже забить косячек не успеют... Причем по совету MasterZiv пересоздал с lock datarows (потому как по TABLE_ID понятно, что в ней сидят аналогичные ID'шки и других таблиц) - шоб другим не мешать ;) gardenmanА ты точно следишь за тем ГДЕ у тебя коммит/роллбак?В смысле? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. _________________ "Helo, word!" - 17 errors 56 warnings ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2005, 14:12 |
|
||
|
Блокировка таблицы
|
|||
|---|---|---|---|
|
#18+
Ex_Soft пишет: > Если очень интересно - Транзакции, архитектура IB > <http://ibase.ru/develop.htm> Уже не интересно. Я очень давно все это штудировал. >> dirty read со всемы вытекающими последствиями. > При чем тут уровень изоляции, когда Как это при чем? При dirty read как раз можно будет спокойно прочитать значение, даже если еще на закоммичена транзакция. Но, естественно, надо четко осознавать, что это значение еще нельзя считать легитимным. > P.S. 2Александр Гoлдун А че Вы так на меня накинулись? Вам показалось. Ничего личного. > BTW, из всех > постов в данном топике только у вашего КПД нулевой. Его преспокойненько > без ущерба можно перенести в ПТ Ну, это модераторы решат. Я просто всегда пытаюсь подойти к проблеме с чуть более глобальной стороны. Иногда, когда человек просит помочь перелезть через забор с колючей проволокой, вовсе не обязательно помогать ему именно в этом. Достаточно понять, что человек все же хочет не столько перелезть, сколько оказатся на территории. Тогда можно просто показать открытые ворота. Это не всегда так, но в заметном числе случаев решать задачу в лоб необязательно. > 4 example, договор, > выступающий в виде своего рода контейнера. И ЭстЪ документы входящие в > него, 4 example - полисы. Ессесно, нумерация должна быть в контексте > договора и непрерывная. Вариант генерить номера внутренних > документов на ходу известен, рассматривался и не удовлетворил. Это действительно распространенная задача. Только вот возлагать ее решение на генераторы imho не самый лучший вариант. А как быть, если в процессе правки происходит активная работа с полисами, вплоть до удаления и создания новых? Я обычно в подобных случаях даю пользователю возможность перенумеровать как автоматически, так и вручную. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2005, 15:24 |
|
||
|
Блокировка таблицы
|
|||
|---|---|---|---|
|
#18+
Александр ГoлдунКак это при чем? При dirty read как раз можно будет спокойно прочитать значение, даже если еще на закоммичена транзакция. Гм... Но если MasterZivupdate этой твоей таблицы ключей и так блокирует твою запись до конца транзакции. От чтения тоже. то какая разница какой уровень изоляции: dirty read, read commited, snapshot - никто все равно прочитать не может . По крайней мере, я выше указанное предложение трактовал для себя таким образом. Александр ГoлдунЯ просто всегда пытаюсь подойти к проблеме с чуть более глобальной стороны.Аналогично... Но бывают моменты (сам, иногда, грешу таким), когда, не зная всей постановки задачи (когда человек предоставляет только локальную проблему, а расписывать ему все глобально попросту нет времени, да и незачем), со строны кажеться, что человек "...хочет странного...". А всего-то, что необходимо человеку, так это попросту решить эту локальную проблему. И все... ;) _________________ "Helo, word!" - 17 errors 56 warnings ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2005, 16:12 |
|
||
|
Блокировка таблицы
|
|||
|---|---|---|---|
|
#18+
Александр ГoлдунКак это при чем? При dirty read как раз можно будет спокойно прочитать значение, даже если еще на закоммичена транзакция. На характер проверил: SQL Advantage (Session 1) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. SQL Advantage (Session 2) Код: plaintext 1. SQL Advantage (Session 2) Executing... и только после SQL Advantage (Session 1) Код: plaintext 1. SQL Advantage (Session 2) TABLE_ID VALUE_ID TABLE_NAME ----------- -------------------- ---------- 1 2 2 так что прочитать-таки действительно нельзя _________________ "Helo, word!" - 17 errors 56 warnings ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2005, 16:51 |
|
||
|
Блокировка таблицы
|
|||
|---|---|---|---|
|
#18+
Ex_Soft wrote: > так что прочитать-таки действительно *_нельзя_* Значит, это был не Dirty Read :). Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2005, 16:52 |
|
||
|
Блокировка таблицы
|
|||
|---|---|---|---|
|
#18+
в сессии 2 перед тем как делать select сделай set transaction isolation level 0 или как там.. не помню уже. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2005, 17:09 |
|
||
|
Блокировка таблицы
|
|||
|---|---|---|---|
|
#18+
Dim2000Значит, это был не Dirty Read gardenmanset transaction isolation level 0 Совершенно верно - прочиталось... Вот теперь у меня все устаканилось в гольове ;) Всем спасибо! _________________ "Helo, word!" - 17 errors 56 warnings ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2005, 17:20 |
|
||
|
Блокировка таблицы
|
|||
|---|---|---|---|
|
#18+
Ex_Soft wrote: > Совершенно верно - прочиталось... Куда бы оно делось с подводной лодки ... собственно, DR тем и хорош, что никогда не блокирует читателей. Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2005, 17:52 |
|
||
|
Блокировка таблицы
|
|||
|---|---|---|---|
|
#18+
[quot Ex_Soft] А select заблокирует (если он будет после begin transaction, но перед DML(insert/update/delete))? Или это прерогатива только DML'я? Во-первых, SELECT -тоже DML. Это о терминах. Во-вторых, да, заблокирует, но только для ИЗМЕНЕНИЯ и возможно (в зависимости от уровня изоляции) для добавления. И также в зависимости от уровня изоляции может быть только на время чтения (данной страницы/строки) или до конца транзакции. А как сие можно забалабенитЪ Нипонил. create table ... lock {datarows | datapages | allpages } Оно? Оно ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2005, 17:55 |
|
||
|
Блокировка таблицы
|
|||
|---|---|---|---|
|
#18+
[quot Ex_Soft] От чтения тоже. то какая разница какой уровень изоляции: dirty read, read commited, snapshot - никто все равно прочитать не может . По крайней мере, я выше указанное предложение трактовал для себя таким образом. Не, Александр прав на все 100%. Я просто не указал это, потому что полагал это само собой разумеющимся. Т.е. UPDATE (delete) блокирует данную запись (страницу) от записи и чтения до конца транзакции для всех других транзакций, кроме транзакций чтения на уровне изоляции DIRTY READ (почему "чтения" - потому что изменнеия данных на DirtyRead не бывает). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2005, 18:02 |
|
||
|
Блокировка таблицы
|
|||
|---|---|---|---|
|
#18+
MasterZivНипонил MasterZivНо есть нюансы. Например - блокировка на уровне полей , т.е. по идее если ты читаешь неизмененное поле, тебе дадут.Как можно в субасе организовать блокировку на уровне полей? На пальцах, если можно и не в облом, обЪясните, pls... _________________ "Helo, word!" - 17 errors 56 warnings ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2005, 18:34 |
|
||
|
Блокировка таблицы
|
|||
|---|---|---|---|
|
#18+
А, понил. А никак не надо ничего организовывать. Она и так работает всегда. Скорее с ней надо бороться, когда она мешает. А бороться известно как Код: plaintext 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2005, 19:04 |
|
||
|
Блокировка таблицы
|
|||
|---|---|---|---|
|
#18+
Ex_SoftКак раз критично ;) Согласитесь, если бы Вы получили договор в котором есть Полис N1, Полис N2, Полис N5, Полис N6, то Вы сразу бы забеспокоились на предмет наличия отсутствия Полис N3, Полис N4 ;) Ну, если продолжить изобретение велосипедов по эмулированию работы генераторов :) то можно было бы создать N табличек вида: Код: plaintext и процедуру вида: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Но это, ИМХО, уже извращение. Лучше уж тогда завести пул идентификаторов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2005, 06:44 |
|
||
|
|

start [/forum/topic.php?fid=55&tid=2013151]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
6ms |
get forum data: |
2ms |
get page messages: |
33ms |
get tp. blocked users: |
1ms |
| others: | 209ms |
| total: | 322ms |

| 0 / 0 |
