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

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

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

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

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

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

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

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

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

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

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

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

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

А как еще-то ?

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

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


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

Задача - обеспечить автоматическое обновление метаданных (сомневаюсь в полном успехе этого начинания, но тут вопросов нет) при достаточно жестких ограничениях на структуру данных и более-менее человеческую целостность при многопользовательском доступе (кроме эксклюзивных блокировок и буфферизации там по сути ничего нет).
...
Рейтинг: 0 / 0
Вопрос по блокировкам
    #34897487
Фотография softwarer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
12345678своя СУБД - это я некорректно выразился. Речь идет, только не смейтесь, о логической надстройке над не совсем СУБД Visual FoxPro.
Смеяться тут незачем, идея разумная для некоторых применений. Во всяком случае, "своя СУБД" - много смешнее.
...
Рейтинг: 0 / 0
Вопрос по блокировкам
    #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]