Цитата: Andrew Carleet от 24.09.2019 01:24:11Все в нашей жизни относительно.
Можно просто запереть данные, над которыми работаем, хоть поле, хоть всю базу. И данные в столбце не поменяются и не исчезнут "в любой момент". Так делать нехорошо? Ну, кто спорит; но подобное встрачается.
Не встречается. СУБД не позволит.
Никто не может заблочить поле более, чем на некоторое небольшое время, достаточное на выполнение операции чтения актуального содержимого и записи обновления. Вы просто не видите того, что происходит под капотом. А под капотом происходит нечто, похожее на следующее:
1. Вы делаете запрос на получение каких-то полей
2. СУБД "делает" вам запись , отправляет ее вам и сохраняет копию (либо у себя, либо на клиенте)
3. Вы там что-то смотрите, колупаетесь, правите
4. Вы отправляете обновление
5. СУБД выполняет что-то, типа такого
- поля, которые Вы запрашивали, блокируются на запись (после Вашего доступа и до этого момента их мог изменить кто угодно)
- получаются актуальные значения полей, которые Вы выбрали
- выполняется сравнение полученных с полученными ранее из копии
- если идентичны, ваши изменения уходят в базу (профит), блоки снимаются.
- в противном случае блоки снимаются, вы получаете отказ, и измененные после вашего запроса поля актуализируются в копии и вашей записи. Внесенные Вами изменения аннулируются
Вы вынуждены перейти к цифре 3.
В результате продолжительность действия блокировки много меньше, чем продолжительность Вашего взаимодействия с базой.
Мало того, помимо тех таблиц, что Вы лично накриэйтили, СУБД создаст в Вашей БД таблицы учета статистики обращений, откуда она будет корректировать максимальные длительности блокировок для разных запросов, чтобы аварийно завершать транзакции, превысившие лимиты.
Вероятность того, что данные изменятся, может быть мала, но это не отменяет события, а с учетом законов Паркинсона, вероятность данного события может даже превысить число \pi.