Debe agregar un índice en el id
columna para asegurarse de obtener un bloqueo de nivel de fila. SELECT ... FOR UPDATE
bloquea todas las filas que se leen para realizar la consulta, no solo las filas que están realmente seleccionadas. Sin un índice, tiene que realizar un escaneo completo de la tabla, por lo que cada fila está bloqueada como resultado.
Con un índice, simplemente coloca un bloqueo en esa entrada de índice, no tiene que leer ninguna otra fila, por lo que no se bloquearán otras filas.