SELCT ... FOR UPDATE
só faz sentido no contexto de uma transação gerenciada, pois exige que os bloqueios sejam retirados nas linhas selecionadas. Por padrão, o JDBC não usa uma transação gerenciada, ele usa uma criada implicitamente que confirma assim que a consulta é executada. Isso quebrará a semântica de
SELECT ... FOR UPDATE
, e o driver JDBC reclama. Para usar uma transação gerenciada, adicione
connection.setAutoCommit(false);
antes de executar a consulta. Depois, execute
connection.commit()
.