MS SQL имеет свое конкретное решение:
Вы можете добавить столбец типа rowversion в таблицу. Этот столбец будет автоматически обновляться в связанных строках ядром при любом операторе update / insert.
Если писатель использует ReadCommitted
уровень изоляции, тогда читатель может использовать ReadUncommitted
уровень изоляции (поэтому ему не нужно ждать завершения всех транзакций, прежде чем возвращать какие-либо результаты), но с запросом, подобным этому:
SELECT * FROM [Log]
WHERE Version > @LastKnownVersion
AND Version < MIN_ACTIVE_ROWVERSION()
Где @LastKnownVersion
- максимальная версия строки, обрабатываемая считывателем, а MIN_ACTIVE_ROWVERSION()
- встроенная функция MS SQL, которая возвращает минимальный номер версии строки, которая все еще находится в транзакции.
Так что с этим решением, даже если у вас есть зафиксированный ID = 4, но еще нет ID = 3, он вернет только те строки, которые были изменены до ID = 3, потому что его версия будет точно MIN_ACTIVE_ROWVERSION()
.
Преимущество этого метода заключается в том, что читателю не нужно ждать, пока транзакция будет зафиксирована, прежде чем получить какие-либо результаты, что может иметь решающее значение при большом количестве авторов. (Читатель может быть заблокирован навсегда.)