Привет всем :)
Есть 2 коллекции: coll1 и coll2. Нужно на основании состояния документа doc1 из coll1 решить, делать ли операцию вставки/обновления для coll1 и coll2.
Например:
1.Проверить длину массива у doc1.arr1, если она удовлетворяет условию, то
2.Добавить в coll2 doc2
3.Сделать doc1.arr1.push(doc2.id)
Понятно, что если 2 потока одновременно сделают проверку doc1.arr1.length, а длина doc1.arr1 была на единицу меньше максимальной, то после push'а эта длина примет невалидное значение
Решение, которое пришло в голову - обернуть эти операции в транзакцию. Но в официальной документации
https://www.mongodb.com/blog/post/mongodb-multi-do... говорится, что транзакционные update-операции вызовут abort у транзакций, содержащих update-операции и пытающихся модифицировать незакомиченный документ. Также транзакционные update-операции заблокируют документ для нетранзакционных update-операций, а те, в свою очередь, после снятия блокировки смогут нормально исполняться. В то время как обычные нетранзакционные read-операции смогут читать документы, только не будут видеть незакомиченных промежуточных результатов транзакций. Также,
как я понял, может быть я ошибаюсь, в
https://www.youtube.com/watch?time_continue=975&v=...
говорится, что транзакционные read-операции не блокируют документ.
Вопрос: можно ли в транзакции заблокировать документ и на чтение и на запись, чтобы
только транзакции не могли читать, понятно, что нетранзакционным read-операциям будет доступно чтение
Если нельзя принудительно заблокировать документ, участвующий в транзакции, то является ли нормальной практикой сделать как бы фиктивное обновление при проверке условия из пункта 1, то есть в фильтр для обновления doc1 добавить arr1.length > x, а в качестве параметра обновления, например, инкрементировать выделенное для этого поле, тогда при попытке "проверки" длины arr1 у остальных транзакций сработает abort.
Заранее извиняюсь, если где-то ошибся в рассуждениях, так как я новичок в этом деле :)