La mejor manera de hacer inserts....
Publicado por Fray (2 intervenciones) el 12/09/2007 19:22:50
Saludos:
Voy directo al grano. Tengo una tabla, por ejemplo cuenta_corriente_cliente que tiene 3 claves primarias (empresa, tipo_de_comprobante, nro_comprobante).
Anteriormente para hacer un insert en dicha tabla hacia:
Lock tables cuenta_corriente_cliente write;
select max(nro_comprobante) from cuenta_corriente_cliente where empresa = 1 AND tipo_de_comprobante = 1;
$nro_comp = $rs->fetchrow_array() +1;
y luego
insert into cuenta_corriente_cliente set empresa = 1, tipo_comprobante = 1 , nro_comprobante = $nro_comp
"hasta hache todo bien"
Luego...
unlock tables;
Con lo anterior me aseguro que nadie pueda leer ni escribir en dicha tabla mientras yo estoy mirando cual es el máximo numero para sumarle uno y hacer el insert.
Esto tiene varios problemas, por un lado no deja trabajar a nadie sobre esa tabla mientras estoy tratando de insertar, y otra, si comencé una transacción previamente, al hacer lock tables se hace un commit implícito, anulando toda posibilidad de hacer rollback.
Para los que piensen ¿y por que no usar una clave auto_increment en vez de hacer tanto rollo?, respondo. INNODB tiene un comportamiento que no es el esperado cuando se trata de campos auto_increment en claves múltiples, porque cuando uno esperaría que el auto_increment se incremente por cada juego de claves, lo hace de forma secuencial directa, si importarle si pertenece a una clave múltiple o no.
Mi problema y es por el cual pido ayuda es... Cual es?, para ustedes la mejor manera de proceder para hacer un insert en una tabla de clave múltiple en una base de datos InnoDB que es consultada actualizada e insertada de manera constante, sin tener que bloquear toda una tabla.
Gracias por contestar, de antemano.
Saludos.
Voy directo al grano. Tengo una tabla, por ejemplo cuenta_corriente_cliente que tiene 3 claves primarias (empresa, tipo_de_comprobante, nro_comprobante).
Anteriormente para hacer un insert en dicha tabla hacia:
Lock tables cuenta_corriente_cliente write;
select max(nro_comprobante) from cuenta_corriente_cliente where empresa = 1 AND tipo_de_comprobante = 1;
$nro_comp = $rs->fetchrow_array() +1;
y luego
insert into cuenta_corriente_cliente set empresa = 1, tipo_comprobante = 1 , nro_comprobante = $nro_comp
"hasta hache todo bien"
Luego...
unlock tables;
Con lo anterior me aseguro que nadie pueda leer ni escribir en dicha tabla mientras yo estoy mirando cual es el máximo numero para sumarle uno y hacer el insert.
Esto tiene varios problemas, por un lado no deja trabajar a nadie sobre esa tabla mientras estoy tratando de insertar, y otra, si comencé una transacción previamente, al hacer lock tables se hace un commit implícito, anulando toda posibilidad de hacer rollback.
Para los que piensen ¿y por que no usar una clave auto_increment en vez de hacer tanto rollo?, respondo. INNODB tiene un comportamiento que no es el esperado cuando se trata de campos auto_increment en claves múltiples, porque cuando uno esperaría que el auto_increment se incremente por cada juego de claves, lo hace de forma secuencial directa, si importarle si pertenece a una clave múltiple o no.
Mi problema y es por el cual pido ayuda es... Cual es?, para ustedes la mejor manera de proceder para hacer un insert en una tabla de clave múltiple en una base de datos InnoDB que es consultada actualizada e insertada de manera constante, sin tener que bloquear toda una tabla.
Gracias por contestar, de antemano.
Saludos.
Valora esta pregunta


0