2011-12-20 41 views
5

¿Cómo bloqueo tablas mysql en php? Actualmente tengo este código:Cómo bloquear tablas mysql en php

$db->query("LOCK TABLES tbl_othercharge WRITE"); 
for($x=0;$x<=500; $x++){ 
    $id = get_max(); 
    $db->query("INSERT INTO tbl_othercharge SET tblocID = '$id', assessmentID='lock1'"); 
} 

$db->query("UNLOCK TABLES"); 

Aquí está la función get_max(), que, obviamente, se producirá un error si la secuencia de comandos se ejecuta simultáneamente.

<?php 
    function get_max(){ 
     global $db; 
     $max = $db->get_var("SELECT MAX(tblocNumber) FROM tbl_othercharge"); 
     if($max == null){ 
      $max = 1; 
     }else if($max >= 1){ 
      $max = $max + 1; 
     } 
     return 'OC'.$max; 
    } 
    ?> 

Estoy tratando de comprobar si todavía hay problemas de concurrencia ejecutando el mismo script en 2 navegadores. El script anterior inserta más de 400 registros en lugar de 999 registros. ¿Cómo bloqueo correctamente la tabla mientras inserto algo en ella?

quiero bloquear la tabla para evitar que algo como esto suceda: enter image description here

Como se puede ver el campo con el prefijo 'OC' en la que debe tener un número que es igual al incremento automático Clave primaria.

+0

¿Y por qué querrías cerrar la mesa? –

+0

¿Qué pasa con el motor de almacenamiento InnoDB y las transacciones? – CodeZombie

+0

@EugenRieck: vea mi edición –

Respuesta

4

La única solución confiable es hacer una inserción con un valor ficticio, obtener la última identificación de inserción y actualizar la fila al valor correcto.

mysql_query("INSERT INTO table (field) VALUES (dummy);"); 
$id = mysql_last_insert_id(); 
mysql_query("UPDATE table SET field='OC{$id}' WHERE id={$id} LIMIT 1;"); 
2

que ensaye:

for($x=0;$x<=500; $x++){ 
    $db->query("LOCK TABLES tbl_othercharge WRITE"); 
    $id = get_max(); 
    $db->query("INSERT INTO tbl_othercharge SET tblocID = '$id', assessmentID='lock1'"); 
    $db->query("UNLOCK TABLES"); 
} 

De esta manera se establece el bloqueo de cada vez que se inserta una fila!

3

Yo sugiero que se elimine el campo 'OC' de la tabla, p.

CREATE TABLE tbl_othercharge (tblocID int AUTO_INCREMENT PRIMARY KEY, assessmentID varchar(100)); 

CREATE VIEW vw_othercharge SELECT tblocID, concat('OC',tblocID) as OCnumber, assessmentID FROM tbl_othercharge 

ahora dirige todos los SELECT seleccionados a vw_othercharge y olvídate de ellos.

Cuestiones relacionadas