Eu acho que o comportamento esperado está um pouco fora. Antes da confirmação de db_slow, todas as linhas da tabela são bloqueadas. Após o commit, há duas linhas. db_fast é desbloqueado quando db_slow é confirmado. Assim, o comportamento é:
- db_slow:selecione a linha 1 e bloqueie-a
- db_slow:veja que é apenas 1 linha e aguarde
- db_fast:tente selecionar a linha 1, veja se está bloqueada, aguarde
- db_slow:inserir linha com '2'
- db_slow:confirmar
- db_fast:desbloqueado e lê 2 linhas
- db_fast:não faz nada
- Finalizar com foo:1, 2