Eu tenho um ambiente típico Java Spring + Postgres (o projeto é legado). Uma camada de persistência de backend tem uma mistura de níveis de isolamento declarados - alguns deles são o padrão, ou seja, READ COMMITED, outros são REPEATABLE READ e alguns são SERIALIZABLE.
Às vezes, as mesmas tabelas de banco de dados são acessadas de transações paralelas com diferentes níveis de isolamento.
Existem algumas regras rígidas para as interações dessas transações?
Eu posso, mais ou menos, entender a situação, quando todas as transações têm o mesmo nível de isolamento e algumas delas declaram bloqueios explícitos para evitar fenômenos de leitura indesejáveis, mas não o caso descrito acima.
Não há problema em misturar diferentes níveis de isolamento, e cada transação se comportará de acordo com as especificações. Por exemplo, em uma
REPEATABLE READ
transação, você verá um instantâneo estável do banco de dados, independentemente dos níveis de isolamento de outras transações.A grande exceção aqui é
SERIALIZABLE
. Se você deseja garantir a serialização, todas as transações envolvidas devem ser serializáveis , para que recebam os bloqueios de predicado necessários. Se você misturar níveis de isolamento, não é mais garantido que haja uma execução serial equivalente.Se você pensar bem, faz sentido: a serialização é uma restrição em toda a carga de trabalho, não apenas em uma única transação.