Как это работает в сценарии веб-приложений, где два разных пользователя могут обновлять одни и те же данные и эффективно получать «грязное чтение»?
Обязательно: Транзакции изолированы друг от друга, так что обновленные аномалии не могут произойти.
Как он обрабатывает параллелизм базы данных?
Посмотрите на BaseX wiki page about transaction management, где описан подход подробно. Отказ от ответственности. Я реализовал новую блокировку базы данных для BaseX во время моего thesis work, поэтому я участвую в проекте.
BaseX применяет несколько механизмов для предотвращения столкновений транзакций. Старая блокировка процесса (которая по-прежнему может быть включена с использованием опции GLOBALLOCK
) просто отрицает несколько запросов в процессе, параллельное выполнение может быть достигнуто во всех экземплярах базы данных, тогда как базовая изоляция была достигнута посредством блокировок файловой системы по каждой базе данных (без каких-либо гарантии относительно взаимоблокировок, ...).
Новее Блокировка базы данных изолирует параллельные транзакции, применяя двухфазную блокировку на уровне базы данных. Таким образом, два запроса, обращающиеся к нескольким базам данных, выполняются параллельно, если они обращаются к различным базам данных, иначе один из них должен будет ждать (но они не запускаются в одно и то же время, наверняка). Недостатком является то, что, поскольку мы хотим поддерживать безусловное выполнение взаимоблокировки, мы пошли на строгую двухфазную блокировку, которая извлекает все блокировки базы данных до выполнения запроса, но страдает от штрафа, поскольку определение того, какие базы данных будут доступны, довольно сложно в динамическом язык как XQuery, часто не удается с глобальными блокировками во всех базах данных.
В будущем (при наличии времени и расписание не установлено) некоторые оптимизации в очереди, особенно ослабляя строгость для двух фазовой синхронизации и оптимистического управления параллелизмом я уже оцененную в моем тезисе, что принесет большие выгоды в параллельном исполнении, особенно для сценариев веб-приложений.
Спасибо. Так что с учетом сценария, когда некоторые данные считываются на двух отдельных браузерах/пользователях одновременно - тогда Пользователь 1 обновляет данные в базе данных по записи - тогда пользователь 2 обновляет одни и те же данные .. не будут ли перезаписаны данные пользователя 1? Это что-то, что нужно учитывать вручную? –
Один запрос (запрос страницы) является одной транзакцией, каждая транзакция является атомарной. Если страница загружается, другие пользователи меняют что-то (пока не отражается на странице), а затем изменения записываются обратно в систему базы данных, изменения других пользователей будут перезаписаны (если вы не применяете никаких дополнительных мер предосторожности). Это почти то же самое, что и для всех других систем баз данных, когда у вас нет транзакций, охватывающих несколько запросов страниц. –
спасибо. FYI Если вы сделаете это на сервере SQL и у вас есть поле метки времени в таблице, оно отклонит второе изменение, если метка времени не соответствует. –