в таблицу transactions нужно заблокировать предикат "WHERE user_id=?", а в постгресе так нельзя. Можно заблокировать таблицу transactions целиком, но тогда всё встрянет
Значит остается advisory_lock как наиболее производительный вариант и все получается?
Нет, для обеспечения consistency не нужно ничего блокировать. Кроме блокировок существуют другие методы обеспечения изоляции, понимаете?
Сейчас я понимаю, что у автора XYZ-story, и надо уточнять, что вообще происходит, и чего хотите получить. Но тогда я ответил на конкретный вопрос: "как сделать так, чтобы на момент коммита нашей транзакции, было соответствие между записанной суммой и реальной?"
Эээ.... кого вообще волнуют "моменты"? ;) Они, строго говоря, не имеют отношения к тому, как работает изоляция примерно во всех (многопользовательских) ACID СУБД. Важно то, в каком состоянии транзакции способны увидеть базу, не более того. Т.е. если транзакция_2 выполняется параллельно "нашей транзакции", совершенно неважно, увидит она базу по состоянию до или после "нашей транзакции". Более того, во (всех?) реализациях MVCC это именно "до".
А что на счет lost update ? Ну допустим у меня 2 транзакции и первая завершилась позже второй, то тут снова кривой баланс?
Во-первых -- баланс в любом случае будет прямой! И в любом случае это будет прямой баланс на какой-то момент в прошлом. Во-вторых -- c read committed вторая транзакцыя дождётся результата первой. В остальных isolation level она откатится.
Я почему то думал что при лаге сети или еще чего-то порядок трандакций не гарантирован и вторая может завершиться раньше первой
Эта последовательность вообще крайне мало зависит от лагов в сети.
Обсуждают сегодня