Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Вопрос по блокировкам / 21 сообщений из 21, страница 1 из 1
25.10.2007, 17:43
    #34895267
12345678
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по блокировкам
Делаем свою легковесную СУБД. Решено использовать инкрементальные блокировки. Т.е. данные, запрашиваемые транзакцией блокируются разделяемой блокировкой, данные изменяемые - эксклюзивной. Но появился вопросик, который вам может показаться идиотским, простите.

С записями все понятно, а вот как быть со связями? Предположим, таблица А связана с таблицой Б отношением 1-ко-многим. Первая транзакция запросила записи из Б, свзанные с записью N в таблице А. Запрошенные записи в Б заблокировались. Но это не мешает другим транзакциям добавлять в Б записи, связанные с N и повторное выполнение запроса даст отличающиеся результаты.

Что я здесь делаю не так? Может при добавлении связанной записи проверять не заблокирована ли запись, на которую она ссылается? Или ввести дополнительные блокировки на связи?
...
Рейтинг: 0 / 0
25.10.2007, 18:01
    #34895342
sergey888
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по блокировкам
Я почему-то считал, что данные для транзакции не блокируются, а копируются в отдельную область, там правятся, и в исправленном виде коммитятся.
...
Рейтинг: 0 / 0
25.10.2007, 18:11
    #34895379
12345678
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по блокировкам
sergey888Я почему-то считал, что данные для транзакции не блокируются, а копируются в отдельную область, там правятся, и в исправленном виде коммитятся.
Вы что??! Ни в коем случае. А если пока будет выполняться первая транзакция, вторая изменит те же данные? Когда завершиться первая, она погребет под собой изменения от второй. Или если к моменту завершения первой транзакции ее исходные данные уже будут изменены, то результаты не будут противоречить данным в БД. В любом случае целостность скажет "гудбай".

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

Но вопрос не в этом, а в том, как сохранить непротиворечивость в отношении связей.
...
Рейтинг: 0 / 0
25.10.2007, 18:18
    #34895412
Кот Матроскин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по блокировкам
То, что Вы описываете, называется "фантом". При некоторых уровнях изоляции такое явление считается допустимым, при других - нет.
Вам бы имхо почитать про уровни изоляции и стандарты по ним....
...
Рейтинг: 0 / 0
25.10.2007, 19:15
    #34895626
12345678
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по блокировкам
О, точно, спасибо! про фантомы читал, но подзабыл, что это.
...
Рейтинг: 0 / 0
25.10.2007, 19:17
    #34895633
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по блокировкам
12345678С записями все понятно, а вот как быть со связями?
Тоже проверять и блокировать. Например, если Вы добавляете в дочернюю таблицу запись, нужно заблокировать те записи в родительских, на которые есть внешние ключи - в противном случае кто-то другой сможет в то же самое время удалить родительскую. Кроме этого, потребуются и другие блокировки. Например, для уникальных индексов: разрулить попытку двух транзакций одновременно вставить записи с одинаковым значением уникального поля.

12345678Первая транзакция запросила записи из Б, свзанные с записью N в таблице А. Запрошенные записи в Б заблокировались.
Ээ.... Вы кажется назвали легковесной, но при этом собираетесь блокировать записи при чтении?

12345678Что я здесь делаю не так?
Если честно - то "беретесь за эту задачу". Перед этим стоило бы несколько лет поработать с СУБД и почитать классиков, того же Гарсия-Молину.
...
Рейтинг: 0 / 0
25.10.2007, 19:20
    #34895642
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по блокировкам
sergey888Я почему-то считал, что данные для транзакции не блокируются, а копируются в отдельную область, там правятся, и в исправленном виде коммитятся.
Cуществует и такая модель действий. У нее, однако, есть большой недостаток: представь себе, что тебе нужно "скопировать в отдельную область" 10 килобайт ради того, чтобы поправить в них 1 байт.
...
Рейтинг: 0 / 0
25.10.2007, 19:44
    #34895705
12345678
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по блокировкам
softwarerНапример, если Вы добавляете в дочернюю таблицу запись, нужно заблокировать те записи в родительских, на которые есть внешние ключи - в противном случае кто-то другой сможет в то же самое время удалить родительскую.а не лучше ли все-таки ставить блокировку на связь? это позволит редактировать записи в родительских, но удалять тх не позволит.

Да, если совсем уж добиваться уровня serializable, то еще и диапазоны надо блокировать(((
...
Рейтинг: 0 / 0
25.10.2007, 21:46
    #34895945
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по блокировкам
12345678а не лучше ли все-таки ставить блокировку на связь? это позволит редактировать записи в родительских, но удалять тх не позволит.
Связи нет (с) Матрица

Именно так. Например, это позволит отредактировать в родительской записи ключ, на который ссылается вставляемая в данный момент дочерняя.

12345678Да, если совсем уж добиваться уровня serializable, то еще и диапазоны надо блокировать(((
Прежде чем говорить об уровнях изоляции (то есть о тонкостях чтения), нужно гарантировать целостность в случае изменений. А и этот вопрос, как мы видим, далеко не так прост.
...
Рейтинг: 0 / 0
25.10.2007, 22:19
    #34895978
12345678
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по блокировкам
ключи то как раз только суррогатные.
...
Рейтинг: 0 / 0
26.10.2007, 11:41
    #34896814
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по блокировкам
sergey888 пишет:
> Я почему-то считал, что данные для транзакции не блокируются, а
> копируются в отдельную область, там правятся, и в исправленном виде
> коммитятся.

Что интересно, не ты один так думаешь !
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
26.10.2007, 11:54
    #34896864
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по блокировкам
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
...
Рейтинг: 0 / 0
26.10.2007, 11:55
    #34896868
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по блокировкам
softwarer пишет:
> Cуществует и такая модель действий. У нее, однако, есть большой
> недостаток: представь себе, что тебе нужно "скопировать в отдельную
> область" 10 килобайт ради того, чтобы поправить в них 1 байт.

Эт не самый большой недостаток
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
26.10.2007, 11:57
    #34896881
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по блокировкам
softwarer пишет:

> Ээ.... Вы кажется назвали легковесной, но при этом собираетесь
> блокировать записи при чтении?

А как еще-то ?

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
26.10.2007, 12:46
    #34897094
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по блокировкам
12345678ключи то как раз только суррогатные.
Это еще ничего не значит. Если считать, что внешний ключ может ссылаться только на первичный, а первичный представлен нередактируемым автоинкрементным полем - тогда да, можно не беспокоиться об изменении мастера.
...
Рейтинг: 0 / 0
26.10.2007, 12:50
    #34897114
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по блокировкам
MasterZiv> Ээ.... Вы кажется назвали легковесной, но при этом собираетесь
> блокировать записи при чтении?

А как еще-то ?
Не погружаясь в "как еще", признаю неточность изначальной формулировки. Судя по словам топикстартера, он собирается удерживать блокировку на прочитанных записях после завершения запроса, то есть делать repeatable read. А это как-то не очень вяжется с "легковесностью", имхо.
...
Рейтинг: 0 / 0
26.10.2007, 12:51
    #34897119
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по блокировкам
softwarer пишет:
> read. А это как-то не очень вяжется с "легковесностью", имхо.


"Легковестность" и "низкоизолированность" не одно и то же.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
26.10.2007, 12:58
    #34897145
12345678
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по блокировкам
softwarer 12345678ключи то как раз только суррогатные.
Это еще ничего не значит. Если считать, что внешний ключ может ссылаться только на первичный, а первичный представлен нередактируемым автоинкрементным полем - тогда да, можно не беспокоиться об изменении мастера.именно так.
...
Рейтинг: 0 / 0
26.10.2007, 13:13
    #34897195
12345678
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по блокировкам
MasterZivPS. А что за проект, нельзя ли поподробнее ? Зачем своя СУБД нужна ?своя СУБД - это я некорректно выразился. Речь идет, только не смейтесь, о логической надстройке над не совсем СУБД Visual FoxPro. (Почему выбрана именно она - отдельный вопрос)

Задача - обеспечить автоматическое обновление метаданных (сомневаюсь в полном успехе этого начинания, но тут вопросов нет) при достаточно жестких ограничениях на структуру данных и более-менее человеческую целостность при многопользовательском доступе (кроме эксклюзивных блокировок и буфферизации там по сути ничего нет).
...
Рейтинг: 0 / 0
26.10.2007, 14:17
    #34897487
softwarer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по блокировкам
12345678своя СУБД - это я некорректно выразился. Речь идет, только не смейтесь, о логической надстройке над не совсем СУБД Visual FoxPro.
Смеяться тут незачем, идея разумная для некоторых применений. Во всяком случае, "своя СУБД" - много смешнее.
...
Рейтинг: 0 / 0
08.11.2007, 18:34
    #34926191
Николай1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос по блокировкам
Возможно мой совет покажется смешным, но для Novell+FoxPro давным давно была библиотека, которая обеспечивала транзакции и блокировки на уровне записей. На мой неискушенный взгляд этого было вполне достаточно.

А на проблему:

====================
С записями все понятно, а вот как быть со связями? Предположим, таблица А связана с таблицой Б отношением 1-ко-многим. Первая транзакция запросила записи из Б, свзанные с записью N в таблице А. Запрошенные записи в Б заблокировались. Но это не мешает другим транзакциям добавлять в Б записи, связанные с N и повторное выполнение запроса даст отличающиеся результаты
====================

Хочется спросить - "и что" ?
Я делаю запрос, получаю одни данные, делаю его через некотое время - получаю другие данные. Это же нормально?

Как я понимаю, проблема в том, что транзакция, которая эти данные изменяет, еще не закончена?
Боюсь, что на FoxPro эту проблему методом блокировок не решить. Более перспективным видится использование семафоров. Тем более, что изменение метаданных, это же не слишком частый процесс? Это же в продакшен вообще "постоянные" данные? Нет ?
...
Рейтинг: 0 / 0
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Вопрос по блокировкам / 21 сообщений из 21, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]