|
|
|
Вопрос по блокировкам
|
|||
|---|---|---|---|
|
#18+
Делаем свою легковесную СУБД. Решено использовать инкрементальные блокировки. Т.е. данные, запрашиваемые транзакцией блокируются разделяемой блокировкой, данные изменяемые - эксклюзивной. Но появился вопросик, который вам может показаться идиотским, простите. С записями все понятно, а вот как быть со связями? Предположим, таблица А связана с таблицой Б отношением 1-ко-многим. Первая транзакция запросила записи из Б, свзанные с записью N в таблице А. Запрошенные записи в Б заблокировались. Но это не мешает другим транзакциям добавлять в Б записи, связанные с N и повторное выполнение запроса даст отличающиеся результаты. Что я здесь делаю не так? Может при добавлении связанной записи проверять не заблокирована ли запись, на которую она ссылается? Или ввести дополнительные блокировки на связи? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2007, 17:43 |
|
||
|
Вопрос по блокировкам
|
|||
|---|---|---|---|
|
#18+
Я почему-то считал, что данные для транзакции не блокируются, а копируются в отдельную область, там правятся, и в исправленном виде коммитятся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2007, 18:01 |
|
||
|
Вопрос по блокировкам
|
|||
|---|---|---|---|
|
#18+
sergey888Я почему-то считал, что данные для транзакции не блокируются, а копируются в отдельную область, там правятся, и в исправленном виде коммитятся. Вы что??! Ни в коем случае. А если пока будет выполняться первая транзакция, вторая изменит те же данные? Когда завершиться первая, она погребет под собой изменения от второй. Или если к моменту завершения первой транзакции ее исходные данные уже будут изменены, то результаты не будут противоречить данным в БД. В любом случае целостность скажет "гудбай". Не используются блокировки только при оптимистическом распараллеливании, но тогда ставятся метки версий или времени изменения. Но вопрос не в этом, а в том, как сохранить непротиворечивость в отношении связей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2007, 18:11 |
|
||
|
Вопрос по блокировкам
|
|||
|---|---|---|---|
|
#18+
То, что Вы описываете, называется "фантом". При некоторых уровнях изоляции такое явление считается допустимым, при других - нет. Вам бы имхо почитать про уровни изоляции и стандарты по ним.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2007, 18:18 |
|
||
|
Вопрос по блокировкам
|
|||
|---|---|---|---|
|
#18+
О, точно, спасибо! про фантомы читал, но подзабыл, что это. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2007, 19:15 |
|
||
|
Вопрос по блокировкам
|
|||
|---|---|---|---|
|
#18+
12345678С записями все понятно, а вот как быть со связями? Тоже проверять и блокировать. Например, если Вы добавляете в дочернюю таблицу запись, нужно заблокировать те записи в родительских, на которые есть внешние ключи - в противном случае кто-то другой сможет в то же самое время удалить родительскую. Кроме этого, потребуются и другие блокировки. Например, для уникальных индексов: разрулить попытку двух транзакций одновременно вставить записи с одинаковым значением уникального поля. 12345678Первая транзакция запросила записи из Б, свзанные с записью N в таблице А. Запрошенные записи в Б заблокировались. Ээ.... Вы кажется назвали легковесной, но при этом собираетесь блокировать записи при чтении? 12345678Что я здесь делаю не так? Если честно - то "беретесь за эту задачу". Перед этим стоило бы несколько лет поработать с СУБД и почитать классиков, того же Гарсия-Молину. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2007, 19:17 |
|
||
|
Вопрос по блокировкам
|
|||
|---|---|---|---|
|
#18+
sergey888Я почему-то считал, что данные для транзакции не блокируются, а копируются в отдельную область, там правятся, и в исправленном виде коммитятся. Cуществует и такая модель действий. У нее, однако, есть большой недостаток: представь себе, что тебе нужно "скопировать в отдельную область" 10 килобайт ради того, чтобы поправить в них 1 байт. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2007, 19:20 |
|
||
|
Вопрос по блокировкам
|
|||
|---|---|---|---|
|
#18+
softwarerНапример, если Вы добавляете в дочернюю таблицу запись, нужно заблокировать те записи в родительских, на которые есть внешние ключи - в противном случае кто-то другой сможет в то же самое время удалить родительскую.а не лучше ли все-таки ставить блокировку на связь? это позволит редактировать записи в родительских, но удалять тх не позволит. Да, если совсем уж добиваться уровня serializable, то еще и диапазоны надо блокировать((( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2007, 19:44 |
|
||
|
Вопрос по блокировкам
|
|||
|---|---|---|---|
|
#18+
12345678а не лучше ли все-таки ставить блокировку на связь? это позволит редактировать записи в родительских, но удалять тх не позволит. Связи нет (с) Матрица Именно так. Например, это позволит отредактировать в родительской записи ключ, на который ссылается вставляемая в данный момент дочерняя. 12345678Да, если совсем уж добиваться уровня serializable, то еще и диапазоны надо блокировать((( Прежде чем говорить об уровнях изоляции (то есть о тонкостях чтения), нужно гарантировать целостность в случае изменений. А и этот вопрос, как мы видим, далеко не так прост. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2007, 21:46 |
|
||
|
Вопрос по блокировкам
|
|||
|---|---|---|---|
|
#18+
ключи то как раз только суррогатные. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.10.2007, 22:19 |
|
||
|
Вопрос по блокировкам
|
|||
|---|---|---|---|
|
#18+
sergey888 пишет: > Я почему-то считал, что данные для транзакции не блокируются, а > копируются в отдельную область, там правятся, и в исправленном виде > коммитятся. Что интересно, не ты один так думаешь ! Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2007, 11:41 |
|
||
|
Вопрос по блокировкам
|
|||
|---|---|---|---|
|
#18+
12345678 пишет: > а не лучше ли все-таки ставить блокировку на связь? это позволит Связей физически в БД как правило не существует. Т.е. я не видел еще таких реализаций. Связь в БД - это набор правил, по которым в определенный момент выполнения транзации проверяются некие данные. При этом для проверки выполняются обычные запросы (ну может быть немного более низкого уровня, чем SQL). > Да, если совсем уж добиваться уровня serializable, то еще и диапазоны > надо блокировать((( key range locking тоже вам может помочь. Чисто теоретически есть и предикативные блокировки, но они обычно не реализуются в СУБД по причине высокой стоимости реализации. Так что ваша задача в общем решения не имеет, в частности имеет много частных решений. > С записями все понятно, а вот как быть со связями? Предположим, таблица А > связана с таблицой Б отношением 1-ко-многим. Первая транзакция запросила > записи из Б, свзанные с записью N в таблице А. Запрошенные записи в Б > заблокировались. Но это не мешает другим транзакциям добавлять в Б записи, > связанные с N и повторное выполнение запроса даст отличающиеся результаты. Извините, читал топик по диагонали. А вот это ВООБЩЕ НИКАК НЕ СВЯЗАНО со связями (они же Foreign Key Constraints). Потому что если вы связи из БД удалите, проблема никуда не денется и никаким образом не трансформируется. Эта проблема называется transaction isolation, и решается она (фантомы исключатся) только на самом верхнем (стандартном) уровне изоляции транзакций - SERIALIZABLE, или на нестандартном SNAPSHOT. Первый в блокировочниках реализуется либо наложением key range блокировки на таблицу A, либо наложением эксклюзивной блокировки на всю таблицу A. Второй реализуестя с помощью механизмов MVCC, искользующих версии записей или их имитацию с использованием undo-лога. PS. А что за проект, нельзя ли поподробнее ? Зачем своя СУБД нужна ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2007, 11:54 |
|
||
|
Вопрос по блокировкам
|
|||
|---|---|---|---|
|
#18+
softwarer пишет: > Cуществует и такая модель действий. У нее, однако, есть большой > недостаток: представь себе, что тебе нужно "скопировать в отдельную > область" 10 килобайт ради того, чтобы поправить в них 1 байт. Эт не самый большой недостаток Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2007, 11:55 |
|
||
|
Вопрос по блокировкам
|
|||
|---|---|---|---|
|
#18+
softwarer пишет: > Ээ.... Вы кажется назвали легковесной, но при этом собираетесь > блокировать записи при чтении? А как еще-то ? Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2007, 11:57 |
|
||
|
Вопрос по блокировкам
|
|||
|---|---|---|---|
|
#18+
12345678ключи то как раз только суррогатные. Это еще ничего не значит. Если считать, что внешний ключ может ссылаться только на первичный, а первичный представлен нередактируемым автоинкрементным полем - тогда да, можно не беспокоиться об изменении мастера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2007, 12:46 |
|
||
|
Вопрос по блокировкам
|
|||
|---|---|---|---|
|
#18+
MasterZiv> Ээ.... Вы кажется назвали легковесной, но при этом собираетесь > блокировать записи при чтении? А как еще-то ? Не погружаясь в "как еще", признаю неточность изначальной формулировки. Судя по словам топикстартера, он собирается удерживать блокировку на прочитанных записях после завершения запроса, то есть делать repeatable read. А это как-то не очень вяжется с "легковесностью", имхо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2007, 12:50 |
|
||
|
Вопрос по блокировкам
|
|||
|---|---|---|---|
|
#18+
softwarer пишет: > read. А это как-то не очень вяжется с "легковесностью", имхо. "Легковестность" и "низкоизолированность" не одно и то же. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2007, 12:51 |
|
||
|
Вопрос по блокировкам
|
|||
|---|---|---|---|
|
#18+
softwarer 12345678ключи то как раз только суррогатные. Это еще ничего не значит. Если считать, что внешний ключ может ссылаться только на первичный, а первичный представлен нередактируемым автоинкрементным полем - тогда да, можно не беспокоиться об изменении мастера.именно так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2007, 12:58 |
|
||
|
Вопрос по блокировкам
|
|||
|---|---|---|---|
|
#18+
MasterZivPS. А что за проект, нельзя ли поподробнее ? Зачем своя СУБД нужна ?своя СУБД - это я некорректно выразился. Речь идет, только не смейтесь, о логической надстройке над не совсем СУБД Visual FoxPro. (Почему выбрана именно она - отдельный вопрос) Задача - обеспечить автоматическое обновление метаданных (сомневаюсь в полном успехе этого начинания, но тут вопросов нет) при достаточно жестких ограничениях на структуру данных и более-менее человеческую целостность при многопользовательском доступе (кроме эксклюзивных блокировок и буфферизации там по сути ничего нет). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2007, 13:13 |
|
||
|
Вопрос по блокировкам
|
|||
|---|---|---|---|
|
#18+
12345678своя СУБД - это я некорректно выразился. Речь идет, только не смейтесь, о логической надстройке над не совсем СУБД Visual FoxPro. Смеяться тут незачем, идея разумная для некоторых применений. Во всяком случае, "своя СУБД" - много смешнее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.10.2007, 14:17 |
|
||
|
Вопрос по блокировкам
|
|||
|---|---|---|---|
|
#18+
Возможно мой совет покажется смешным, но для Novell+FoxPro давным давно была библиотека, которая обеспечивала транзакции и блокировки на уровне записей. На мой неискушенный взгляд этого было вполне достаточно. А на проблему: ==================== С записями все понятно, а вот как быть со связями? Предположим, таблица А связана с таблицой Б отношением 1-ко-многим. Первая транзакция запросила записи из Б, свзанные с записью N в таблице А. Запрошенные записи в Б заблокировались. Но это не мешает другим транзакциям добавлять в Б записи, связанные с N и повторное выполнение запроса даст отличающиеся результаты ==================== Хочется спросить - "и что" ? Я делаю запрос, получаю одни данные, делаю его через некотое время - получаю другие данные. Это же нормально? Как я понимаю, проблема в том, что транзакция, которая эти данные изменяет, еще не закончена? Боюсь, что на FoxPro эту проблему методом блокировок не решить. Более перспективным видится использование семафоров. Тем более, что изменение метаданных, это же не слишком частый процесс? Это же в продакшен вообще "постоянные" данные? Нет ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.11.2007, 18:34 |
|
||
|
|

start [/forum/topic.php?fid=32&fpage=112&tid=1544208]: |
0ms |
get settings: |
11ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
67ms |
get topic data: |
8ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 230ms |
| total: | 398ms |

| 0 / 0 |
