Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

218
Vistas
¿Debo bloquear una tabla de PostgreSQL al invocar setval para la secuencia con la función de identificación máxima?

Tengo el siguiente script SQL que establece el valor de secuencia correspondiente al valor máximo de la columna ID:

 SELECT SETVAL('mytable_id_seq', COALESCE(MAX(id), 1)) FROM mytable;

¿Debería bloquear 'mytable' en este caso para evitar cambiar la ID en una solicitud paralela, como en el ejemplo a continuación?

 request #1 request #2 MAX(id)=5 inserted id 6 SETVAL=5

¿O setval(max(id)) es una operación atómica?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Su sospecha es correcta, este enfoque está sujeto a las condiciones de carrera.

Pero bloquear la tabla no ayudará, porque no evitará que una transacción concurrente obtenga nuevos valores de secuencia. Esta transacción se bloqueará mientras la mesa esté bloqueada, pero felizmente continuará insertándose una vez que el bloqueo desaparezca, utilizando un valor de secuencia que obtuvo mientras la mesa estaba bloqueada.

Si fuera posible bloquear secuencias, esa podría ser una solución, pero no es posible bloquear secuencias.

Se me ocurren dos soluciones:

  1. Elimine todos los privilegios en la secuencia mientras la modifica, de modo que las solicitudes simultáneas a la secuencia fallen. Eso provoca errores, por supuesto.

  2. La forma pragmática: usar

     SELECT SETVAL('mytable_id_seq', COALESCE(MAX(id), 1) + 100000) FROM mytable;

    Aquí 100000 es un valor que es con seguridad mayor que las filas de números que podrían insertarse mientras se ejecuta la operación.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda