Ver Mensaje Individual
  #12  
Antiguo 06-11-2019
Avatar de mamcx
mamcx mamcx is offline
Moderador
 
Registrado: sep 2004
Ubicación: Medellín - Colombia
Posts: 3.911
Reputación: 25
mamcx Tiene un aura espectacularmamcx Tiene un aura espectacularmamcx Tiene un aura espectacular
Cita:
Empezado por oscarac Ver Mensaje
alguien mas en la web (php) que usa esta misma tabla ya capturo y grabo ese numero, por lo cual me aparece el mensaje de error (porque es un campo PK) que no acepta duplicados
Un rdbms esta pensado para multiples usuarios/app. DEJA DE PENSAR QUE TIENES EL CONTROL TOTAL.

Esta es la clave.

Cita:
Empezado por oscarac Ver Mensaje
lo obtengo generando el MAX del campo y le sumo 1, el asunto es que cuando estoy tratando de obtener el ultimo numero para sumarle uno,
Primer problema. Esta no es la forma de tener IDs propios. Lo que haces es subotpimo:

https://stackoverflow.com/questions/...y-alternatives

Como funciona un max?

Tienes un MILLON de registros. La BD por defecto, recorre el MILLON de registro comparando si este es mayor al anterior. Al final, da un resultado. Luego le sumas 1. Esos significa que estas introduciendo una ESPERA. Eso genera una ventana para que otra operacion compita contigo. (Con un indice se puede agilizar el proceso. Igual, es una demora)

En otras palabras, el orden de ejecucion en una RDBMS NO ES deterministico, sino aleatorio. (a menos que uses una transaccion, pero nota mas abajo).

La forma de tener tu propio generador:
  • Usa un autoincrement, es lo mejor
  • Usa una tabla "consecutivos" de un solo registro. Guardas el ultimo y tomas y actualizas de ella. Es MUCHO mas rapido que hacerle max a tus tablas.
  • Abandona los IDs consecutivos y usa un campo GUID o similar, que estan hechos para IDs GLOBALES.

Cita:
Empezado por oscarac Ver Mensaje
uso transacciones
Solo son LOCALES A TU OPERACION. No hay una forma *eficiente* de hacer transacciones globales, y lo que hay implica meter un monton de asuntos que es mejor no lidiar con ellos.

Cita:
Empezado por oscarac Ver Mensaje
no podria bloquear la tabla para grabar el registro q quiero y despues liberarla ?
o estoy usando mal las transaciones
Eso es NEGAR la forma como funciona un rdbms. Lo que en otras palabras, es malo. Por ejemplo, si pones un campo booleano para indicar que el registro esta "ocupado" y luego lo deschuleas, eso puede PARECER que funciona. Pero si la app muere a mitad del camino? Dejas el registro bloqueado y generas un DEAD LOCK. Algo que empieza por "dead" no es nada bueno!

-----
Asi, que que hacer? El problema que tienes te grita: Tu diseño esta errado. Deja que la BD genere IDs.

A menos que presentes un escenario justificable, yo pararía ahi.
__________________
El malabarista.
Responder Con Cita