Ao analisar alguns logs SQL, notei que algumas consultas não são coerentes com o que o código pretende fazer, devido ao uso misto de Active Record e mini_sql.
Ao tentar atualizar alguns reviewables, incrementamos a versão dentro de uma transação para evitar possíveis condições de corrida (como mostra o trecho de código abaixo). Embora pareça que o incremento faz parte da transação, na verdade não é.
Reviewable.transaction aqui é um recurso do Active Record, enquanto increment_version! usa o mini_sql:
O Active Record não tem conhecimento do que o mini_sql faz. Parece que o Active Record usa algum recurso de preguiça (lazy), no qual o BEGIN é emitido logo antes da primeira consulta dentro da transação ser executada. Assim, a versão é incrementada primeiro e, em seguida, a transação começa logo antes da primeira consulta do Active Record ser emitida. Isso acaba ficando algo assim:
UPDATE reviewables SET version = version + 1 WHERE version=version AND id = reviewable.id RETURNING version;
BEGIN;
...
Com o incremento da versão fora da transação, algumas garantias fornecidas pelo bloqueio otimista não são alcançadas. Isso ocorre porque o incremento não é atômico em relação à transação.