Marklogic MVCC: современный и неблокирующий
Я пытаюсь понять современные и неблокирующие параметры с помощью примера. Пожалуйста, дайте мне знать, если я прав.
Предположим, у нас есть транзакции T1, T2, T3, происходящие при отметке времени = 10.
Т1, Т2, Т3 фиксируются на 30, 40, 50 соответственно. Если транзакция запроса приходит в 35:
для современных: запрос читает версию с подтвержденным T1 и держит T2 и T3 в ожидании завершения чтения.
Для неблокирующих: запрос становится доступным только для чтения после того, как все 3 транзакции T1, T2, T3 зафиксированы в 50.
1 ответ
Это проще всего понять и имеет наибольшее значение, если вы подумаете о том, чтобы запрашивать кластер реплик аварийного восстановления. В настройке DR каждый лес на первичном сервере реплицирует свои журнальные кадры в соответствующие леса на реплике. В базе данных часто содержится несколько лесов, и поскольку репликация осуществляется на уровне леса, в некоторых лесах данные могут быть немного позже, чем в других.
Теперь представьте, что запрос (только для чтения) поступает в базу данных на реплике. У вас есть два варианта. Во-первых, вы можете выполнить запрос в последний момент времени, для которого у вас есть все данные (это неблокирование). Во-вторых, вы можете выполнить запрос с последней отметкой времени, для которой вы видите какие-либо данные (в самом дальнем лесу), и дождаться прибытия всех данных (для других лесов), чтобы вы могли получить согласованное с точки зрения транзакций представление для этого более позднего времени (это одновременно).
Обратите внимание, что оба варианта являются транзакционными. Это просто о том, как база данных выбирает временную метку, в которую вы хотите выполнить запрос.
Запросы только для чтения всегда выполняются без блокировки.