lunes, agosto 03, 2009

Control de concurrencia

Solución al problema de concurrencia con el motor de BD Informix y lenguaje de programación PHP
No lo he probado con otros motores de bases de datos, pero debe de ser muy parecido.
Hay que tener una tabla, con el siguiente modelo fisico
Key
Column name
Domain
Data type
Not null
Unique
Check
Default
flag
Char (1)
NO
NO
 
SQL para la creacion de la tabla.

Create Table "nombre_tabla" ( "flag" Char(1) );


do
{
// nombre_tabla es una tabla para que cuando el estado este en 1 no continue este script
// hasta que el estado este en 0, y asi poder controlar la grabacion de todos los posibles
// usuarios que esten intentando grabar al mismo tiempo
$verificarsi = 10;
$controlar1 = "BEGIN WORK"; // (Se almacena en la variable la orden para inicio de transaccion)
$controlar2 = "LOCK TABLE nombre_tabla_bloquear IN EXCLUSIVE MODE"; //(Se almacena en la variable la orden para bloqueo de una tabla)
$consultarEstado = "SELECT flag FROM nombre_tabla_control WHERE flag = '0' or flag = 0";
$ejecutarConsultarEstado = ifx_query ($consultarEstado,$variable_administracion_conexion);
$salida = ifx_fetch_row ($ejecutarConsultarEstado);
$verificarsi = $salida['flag'];
if ($verificarsi == 0)
{
  ifx_query ($controlar1,$variable_administracion_conexion);
  //Ejecutar el inicio de la transaccion
  ifx_query ($controlar2,$variable_administracion_conexion); / /Ejecutar bloqueo de la tabla
  $cambiarEstadoflag = "UPDATE nombre_tabla_control SET flag = '1'"; // Actualizar el campo flag en "1"
  ifx_query ($cambiarEstadoflag,$variable_administracion_conexion);
  $CONSULTAR_datos = "SELECT * FROM nombre_tabla_control";
  $EJECUTAR_CONSULTAR_datos = ifx_query ($CONSULTAR_datos,$variable_administracion_conexion);
  while ($SALIDA = ifx_fetch_row ($EJECUTAR_CONSULTAR_datos))
  {
   if ($SALIDA['flag'] == "1" or $SALIDA['flag'] == 1) $controlarGrabacion = FALSE;
  }
}
while ($controlarGrabacion); // --- (Aqui va el codigo que manipula la tabla bloqueda)

---

$verificacionotro = TRUE;
do  // (No nesesariamente tiene que ser dentro de un bucle do)
{
$cambiarEstadoflag = "UPDATE nombre_tabla_control SET flag = '0'"; // (Actualizar el campo flag a 0 en la tabla de control)
ifx_query ($cambiarEstadoflag,$variable_administracion_conexion);
$verificacionotro = FALSE;
}while ($verificacionotro);





No hay comentarios.: