Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Bloqueo de tablas (consulta)

Estas en el tema de Bloqueo de tablas (consulta) en el foro de Mysql en Foros del Web. saludos amigos fijense lo que quiero hacer mi tabla tiene un id autoincrement y deseo que se cree y que apenas se creee quiero poder ...
  #1 (permalink)  
Antiguo 11/02/2013, 21:34
 
Fecha de Ingreso: abril-2006
Mensajes: 72
Antigüedad: 18 años, 3 meses
Puntos: 0
Bloqueo de tablas (consulta)

saludos amigos fijense lo que quiero hacer mi tabla tiene un id autoincrement y deseo que se cree y que apenas se creee quiero poder usar ese id generado para hacer otras acciones ejemplo: el id generado es 34 y con ese numero empiezo a hacer otras cosas de una ves. pense bueno lo primero es que apenas cree el id debo garantizar que nadie mas lo modifique ni perderlo por eso uso este script y mi consulta es si es lo mejor que se puede usar o si hay algo mejor que se puede usar quisiera recomendaciones incluso no se si lo q estoy haciendo es lo correcto:
a es en php
$Sql1 = "LOCK TABLES users WRITE"; // evito la escritura sobre esa tabla
$Sql3 = "SELECT LAST_INSERT_ID() as id FROM users"; // selecciono el ultumo id insertado (id es un autoincrement)
$Sql4 = "UNLOCK TABLES"; // desbloqueo la tabla
$sql="consulta";
mysql_query($Sql1,$conexion) ; //ejecuto el bloqueo
mysql_query($sql,$conexion) ; //ejecuto la consulta
if (mysql_error()){
echo ("<script language='javascript'> alert('Error al
conectarse al servidor..!')
location.href('index.php');
</script>");
}else{
$consulta=mysql_query($strSql3,$conexion) ;// si la consulta es
correcta ejecuto la
obtencion del ultimo id
creado
$res=mysql_fetch_object($consulta);
$r=$res->id; // lo asigno para devolverlo
}
mysql_query($strSql4,$conexion) ; // al final de toodo desbloqueo la tabla
return $r; // retorno el ultimo id
  #2 (permalink)  
Antiguo 12/02/2013, 05:22
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 7 meses
Puntos: 2658
Respuesta: Bloqueo de tablas (consulta)

Cita:
a es en php
A nivel de MySQL lo que haces es demasiado enredado y no tiene mucho sentido. Parece que no comprendes bien la generación y uso de las PK autoincrementales, ni has visto el tema de transacciones, y tampoco pareces tener claro el sentido de las PK mismas. Para que se entienda: Un autonicremental sólo se genera en un insert, y nadie en su sano juicio lo modifica nunca, con lo que la situación que quieres prevenir, difícilmente exista.
Además, la consulta que propones
Código MySQL:
Ver original 
no es correcta, no devolverá el dato deseado, y puede caer en conflictos por uso de palabras reservadas. No es correcta porque esa función no aplica a tablas, sino a un valor que gestiona el MySQL. Es un parámetro global de la conexión, y sólo se recupera luego del insert, nada más. No requiere invocación a tablas.

Por otro lado, tu descripción es algo vaga, y no nos das un ejemplo de que "otras cosas" haces luego con el ID. Sin eso es difícil saber si tiene algun sentido lo que planteas.

En cuanto a lo de PHP, aclaranos si tu duda es a ese nivel, porque en este foro no tratamos temas de programación (sólo SQL y BBDD), y de ser así debo mover el post al foro correcto.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 12/02/2013 a las 06:26
  #3 (permalink)  
Antiguo 12/02/2013, 10:16
 
Fecha de Ingreso: abril-2006
Mensajes: 72
Antigüedad: 18 años, 3 meses
Puntos: 0
Respuesta: Bloqueo de tablas (consulta)

saludos, gracias por la explicacion compadre, te explico mejor lo que deseo hacer
obviamente hago un insert en donde se crea el id autoincrement. que ocurre yo necesito para asociar con otras tablas saber el id creado para poder asignar los valores y tenerlos relacionados ejemplo:
registro los datos personales de una persona:
$sql="INSERT INTO empresas (nombre,dirreccion,) VALUES ('$nombre','$dirreccion')"; la tabla tiene un campo que se llama "id" y es autoincrement. cuando ejecuto esta sentencia se crea automaticamente un id asociado a ese persona cierto??? bien que deseo yo saber cual fue el id creado por que resulta que ese id es la relacion con otra tabla y debo hacer algo como :
$sql="INSERT INTO provedor (id_empresa,id_provedor,nombre,tipo) VALUES ('$id',
'$nombre','$tipo')"; cuando se estan llenando los datos de registro el usuer pone los datos de la empresa y selecciona sus proveedores por eso necesito la relacion

que quiero evitar que si en otro lado se registra al mismo tiempo otra empresa no perder el autoincrement que primero de genero puesto que son varios los que estan haciendo el registro y por cada sentencia se genera un id automatico.
bueno eso es lo que mi cabecita piensa quiza no es asi y es lo que quisiera me orientaran en lenguaje natural lo que pretendo hacer con el script mostrado es crear el id autoincrement -> bloquear la tabla para que nadie pueda hacer un insert y cambie mi id -> obtener el ultimo id creado (campo autoincrement) -> desbloquear la tabla.

porfa si es errado ese razonamiento te agradeceria aclararmelo y si hay una practica mas eficiente para hacelo tambien

aaa aun cuando el sistema es en php el problema lo presento es con mysql y sus consultas
  #4 (permalink)  
Antiguo 12/02/2013, 10:36
 
Fecha de Ingreso: abril-2006
Mensajes: 72
Antigüedad: 18 años, 3 meses
Puntos: 0
Respuesta: Bloqueo de tablas (consulta)

fijate este script funciona sin problema me da el ultimo id insertado
Cita:
Editado: Codigo de programación no corresponde al foro.
lo que no se es si la idea de bloquear la tabla para que nadie insertando otro registro me modifique mi ultimo autoincrement funciona o esta bien planteado

Última edición por gnzsoloyo; 12/02/2013 a las 14:43 Razón: olvide algo
  #5 (permalink)  
Antiguo 12/02/2013, 10:39
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 7 meses
Puntos: 2658
Respuesta: Bloqueo de tablas (consulta)

Blade: Dime si quieres trabajar el tema con PHP o con MySQL.
Si es sobre MySQL, debes eliminar cualquier codificación de programación, o me veré obligado a hacerlo yo.
Si quieres seguir esto en PHP, te paso el post al Foro de PHP.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 12/02/2013, 11:14
 
Fecha de Ingreso: abril-2006
Mensajes: 72
Antigüedad: 18 años, 3 meses
Puntos: 0
Respuesta: Bloqueo de tablas (consulta)

colle compadre tendras que cambiarlo por que no se como eliminarlo o modificarlo. pense que como el problema era con la consulta en mysql este era el lugar indicado. disculpa el error compa
  #7 (permalink)  
Antiguo 12/02/2013, 14:42
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 7 meses
Puntos: 2658
Respuesta: Bloqueo de tablas (consulta)

Vamos por parte:

- Los problemas de concurrencia en MySQL se resuelven principalmente usando transacciones, para lo cual se requiere el uso de tablas InnoDB. Ese es el modo eficiente de hacerlo, ya que el bloqueo, como lo planteas, te traerá otros problemas de ejecución, que no has considerado.

- Realizar un bloqueo de tabla no es necesariamente la mejor opción, porque esto no impide que los otros usuarios accedan a leerla. Lo único que no pueden hacer es escribir en ella. Con esto, puede suceder que otro usuario genere una clave posible que sea exactamente la misma, sin saberlo, porque la consistencia en tu proyecto la estás manejando a nivel de script.

- Por otro lado, la elección de claves autoincrementales en sistemas de alta concurrencia, especialmente para tablas críticas como usuarios, clientes, productos, etc, puede no ser una buena idea. Antes bien, es conveniente usar identificadores tales que seguramente no puedan duplicarse (CUIT/RUT a nivel impositivo, Códigos de Barra para los productos), y usar esos valores como claves primarias. Tales valores generarían un error de inserción aún si no usas transacciones.

- La gestión de la próxima clave es un tema ya resuelto, no hay que inventar el agujero del mate. Pero tienes que tomarte el tiempo de leer el manual de referencia oficial de MySQL, que es donde aparece eso (Bloqueo de la próxima clave: El problema del fantasma).

- Finalmente, es mejor que latas de este tipo se realicen por medio de stored procedures, porque de ese modo se pueden modularizar en ellos las validaciones que deben hacerse, aun cuando las hayas hecho anteriormente, y como se ejecutan como un sólo llamado, puedes asegurar la integridad de datos de mejor forma.

Dale una leída a este link, para entender lo que son las transacciones y cómo operan, si no conoces el tema: http://ict.udlap.mx/people/carlos/is341/bases10.html
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Etiquetas: bloqueo, insert, php, select, sql, tabla, tablas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:38.