|
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,768
|
|||||||||||
Блокировка при чтении?20.07.2022, 09:14. Показов 989. Ответов 6
Метки нет (Все метки)
Есть типовой пример взаимной блокировки ресурса.
2. Оба подключения, проанализировав результаты запроса, принимают решение добавить запись в БД. 3. Первый 'insert' упирается в блокировку от второго 'select', второй 'insert' - в блокировку от первого 'select'. 4. Ок, deadlock, sqlserver немного подождёт, сгенерирует соответствующую ошибку для одного из коннектов, закроет его транзакцию, а другой коннект при этом завершится корректно. Данные согласованы, но реализация через deadlock и отлов соответствующего исключения выглядит слишком костыльно. Вопрос - как это правильно решать без переноса части БЛ в базу и без взаимных блокировок? Если снизить уровень изоляции, то взаимной блокировки не будет, но и согласованность данных тогда не гарантируется, т.к. 'insert' будет происходить не в том состояние таблицы, в котором она была на момент 'select'. Блокировать на уровне логики приложения - весьма сложная задача (экземпляров сервера может быть много, база общая). Вариант, который работает - выборка с эксклюзивной блокировкой таблицы (закомментированный фрагмент 'with (tablockx)'). Но подобное решение вызывает некоторые сомнения, т.к. и упоминается (хотя сценарий вполне типовой) мало где, и в EFCore для этого дефолтного функционала нет. Вероятно, это можно решить как-то иначе?
0
|
|||||||||||
| 20.07.2022, 09:14 | |
|
Ответы с готовыми решениями:
6
Блокировка файла при чтении и записи "Нарушение прав доступа при чтении по адресу" при чтении структур из бинарного файла Блокировка клавиши при нажатии в одной форме и блокировка в другой, третьей |
|
14314 / 9399 / 1355
Регистрация: 21.01.2016
Сообщений: 35,447
|
|||
| 20.07.2022, 13:15 | |||
|
1
|
|||
|
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,768
|
|||
| 20.07.2022, 13:55 [ТС] | |||
|
0
|
|||
|
|
|
| 20.07.2022, 14:01 | |
|
kotelok, А какой шанс того, что одни и те же данные будут редактировать два пользователя одновременно?
Может проще использовать timestamp и при сохранении данных проверять его? Если разные, то вывести пользователю новые данные для сравнения...
1
|
|
|
1341 / 920 / 265
Регистрация: 08.08.2014
Сообщений: 2,768
|
|||
| 20.07.2022, 14:17 [ТС] | |||
|
И не обязательно два разных пользователя. Сейчас, на другом проекте, этот сценарий стабильно повторяется в рамках одного пользователя в силу особенностей реализации клиентской части. Пользователь нажимает "ок", клиентское приложение создаёт два таска на обращение к API и далее параллельно их выполняет. В итоге, в режиме отладки и при localhost-сервере, эти запросы приходят на сервер достаточно одновременно, чтобы наступить на эту взаимную блокировку. Добавлено через 1 минуту 1. Взяли сущность из БД. 2. Модифицировали. 3. Сохраняем обратно. Действительно удобен какой-то вариант 'row version' (timestamp, например). И он корректно работает даже если три обозначенных выше пункта сильно разнесены во времени и выполняются в рамках разных транзакций.
0
|
|||
|
14314 / 9399 / 1355
Регистрация: 21.01.2016
Сообщений: 35,447
|
|||
| 20.07.2022, 16:10 | |||
|
Добавлено через 4 минуты Вариант с оптимистичными блокировками самый оптимальный, на самом деле. На втором месте по адекватности идёт уже SELECT ... FOR\WITH UPDATE. Тут уже другие транзакции с таким же типом лока будут вставать в очередь. Если не злоупотреблять, то вполне себе вариант. Уж точно лучше, чем полная блокировка всей таблицы... Ну и то, что такие вещи не доступны пользователям EF'а... Проблемы этих пользователей...
1
|
|||
|
|
||
| 23.07.2022, 14:00 | ||
|
Если MSSQL - можно юзать SNAPSHOT уровни.
1
|
||
| 23.07.2022, 14:00 | |
|
Помогаю со студенческими работами здесь
7
Нарушение прав доступа при чтении при работе с большим массивом
Ошибка при добавлении элементов в список при чтении файла Ошибка при вызове метода класса, при чтении из файла Абракадабра при записи в файл и при чтении из него кириллицы Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git
main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели
8ATzM_2aurI
|
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2.
Задача: запретить редактирование документа, если он открыт у другого пользователя.
/ / . . .
|
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои.
А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
|
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20%
kYBz3eJf3jQ
|
|
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
|
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
|
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора
Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2.
Задача: уведомлять пользователя, если. . .
|
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2.
Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
|