транзакция при таком уровне изоляции видит не полностью согласованное представление базы данных. Но ведь это нонсенс, такой уровень изоляции задуман как раз для обеспечения такой гарантии!
https://postgrespro.ru/docs/postgresql/11/transaction-iso
Рассчитывая, что сериализуемые транзакции предотвратят аномалии, важно понимать, что любые данные, полученные из постоянной таблицы пользователя, не должны считаться действительными, пока транзакция, прочитавшая их, не будет успешно зафиксирована. Это верно даже для транзакций, не модифицирующих данные, за исключением случая, когда данные считываются в откладываемой транзакции такого типа.
> как будто транзакция при таком уровне изоляции видит не полностью согласованное представление базы данных Ничего подобного (и это справедливо для любого уровня изоляции в любой ACID СУБД, если в их документации явно не указано обратное для какой-то конкретной ситуации — как в PostgreSQL для SERIALIZABLE READ ONLY DEFERRABLE)! Вот гиперболизированный пример того, о чём тут речь: > BEGIN TRANSACTION; BEGIN > SELECT SUM(val) FROM vals; sum -------- <NULL> (1 row) > INSERT INTO vals(val) VALUES (2), (2); INSERT 0 2 -- Внимание на результат! > SELECT SUM(val) FROM vals; sum ----- 5 (1 row) > COMMIT; ERROR: could not serialize access due to read/write dependencies among transactions ROLLBACK Т.е. до успешного получения от сервера ответа COMMIT (на выданную ему команду COMMIT) никаким результатам, полученным из транзакции, доверять нельзя. Я подозреваю, что многие нарушают этот принцип (например, потому что просто не знают о нём).
Обсуждают сегодня