Foros del Web » Programando para Internet » PHP »

Concurrencia y semaforos

Estas en el tema de Concurrencia y semaforos en el foro de PHP en Foros del Web. Hola soy novato en php por lo que llevo algún tiempo mirando scripts para ver como se trabaja con él. Mi duda es la siguiente, ...
  #1 (permalink)  
Antiguo 28/02/2004, 14:26
 
Fecha de Ingreso: julio-2003
Mensajes: 21
Antigüedad: 14 años, 4 meses
Puntos: 0
Concurrencia y semaforos

Hola
soy novato en php por lo que llevo algún tiempo mirando scripts para ver como se trabaja con él. Mi duda es la siguiente, tengo entendido que cuando existe la posibilidad de que un proceso acceda a algún recurso compartido por el mismo u otro proceso de forma concurrente una solución es la de usar semáforos para asegurar que se acceda a ese recurso cuando ningún proceso lo esté usando, he visto en el manual de php.net que existe soporte para esto, pero en los scripts que veo nunca se utiliza, por ejemplo para escribir en un fichero de texto plano o para modificar algún dato en una bd. ¿Existe alguna razón que se me escape?
Gracias
  #2 (permalink)  
Antiguo 29/02/2004, 01:31
Avatar de Bartak  
Fecha de Ingreso: enero-2004
Ubicación: Chilito
Mensajes: 121
Antigüedad: 13 años, 10 meses
Puntos: 0
tienes razon lo semaforos son para reservar recursos a un proceso, luego de terminado este proceso los recursos se le asignan a otro, es parecido a las colas de banco en ellas tienes un fila de personas esperando por un cajero desocupado.

ahora con respecto a las actualizaciones de datos en las BD,
se ocupa harto la exclusividad o bloqueo de la tabla o tupla
para ingresar o actualizar datos de manera que en ese momento nadie mas pueda hacer algun ajuste a esa tabla o tupla(este es un control de concurrencia pesimista) . ponte tu en los sistemas de informacion de las agencias de vuelo, hay vuelos que hacen varias escalas y en cada escala la agencia vende pasajes con un determinado asiento, imagina que en un mismo momento en dos paise diferente se vende el mismo asiento, esto no puede ocurrir por que ocurriria un fallo de integirdad de la BD por esto existen tecnicas para manejar esots errores:

tecnica de bloqueo : es una variable asociada acada elemento de datos que describe el estado de dicho elemento respecto a las posibles operaciones (recuperar o actualizacion) que se pueden
realizar sobre ellos en cada momento. las transacciones pueden llevar a cabo bloqueos, impidiendo a otros usuarios la recuperacion o actualizacion de los elementos bloqueados, para evitar inconsistencias en el acceso concurrente.
Los SGBD tienen bloqueos(por tupla, por tabla) para asegurar la consistencia. Los usuarios también pueden bloquear explícitamente los objetos, impidiendo el acceso por parte de otros usuarios.

Tipos de bloqueo


Exclusivos: cuando una transacción mantiene un bloqueo de este tipo, ninguna otra transacción puede acceder a el objeto bloqueado, ni bloquearlo, hasta que sea liberado por la transacción que lo había retenido. Se utiliza cuando se quiere actualizar datos.


Bloqueo compartido: cuando una transacción bloquea en este modo, permite que otras transacciones retengan también el objeto en bloque compartido, pero no exclusivo. Este tipo se utiliza cuando no se requiere actualizar datos, pero se desea impedir cualquier modificación mientras los datos son consultados.

El algoritmo que se utiliza se llama bloqueo de dos fases (two phase locking).

El problema de las técnicas de bloqueo es que puede producirse un interbloqueo (deadlock), dos o mas transacciones están esperando cada una de ellas que la otra libere algún objeto antes de seguir

esto se puede solucionar

Prevenir el deadlock: obliga a que las transacciones bloqueen todos los elementos que necesitan por adelantado. EN caso de no poder conseguir todos esos elementos no bloquea ninguno y se queda en espera hasta volver a intentarlo.

Detectar el deadlock: Se controla de forma periódica si se ha producido un deadlock. Se construye un grafo en espera, cada nodo es una transacción en ejecución y un arco de una transacción Ti a Tj, en caso que Ti esté esperando un elemento que ocupa Tj. Si existe un ciclo en el grafo tenemos un deadlock. La solución es escoger transacciones víctimas y deshacerlas, hasta que desaparezca el deadlock. Cada SGBD tiene políticas diferentes para escoger víctimas.

Otra técnicas mas optimista es la
Técnicas de marca de tiempo (timestamping)

Las marcas de tiempo son identificadores únicos que se asignan a las transacciones, que se consideran como el tiempo de inicio de una transacción. Con esta técnica no existen bloqueos. Ordena las transacciones. Se retrasan.


Las transacciones acceden libremente a los elementos, y antes de finalizar se determina si ha habido interferencias.

Este tipo de técnicas considera que las transacciones tienen 3 fases:


Lectura: las transacciones realizan operaciones sobre copias privadas de los objetos (accesibles solo por la transacción)


Validación : en la que se comprueba si el conjunto de objetos modificados por una transacción se solapa con el conjunto de objetos modificados por alguna otra que haya hecho la validación durante la fase de lectura de dicha transacción


Grabación:, en el caso de no detectar interferencias se graban las modificaciones, convirtiendo las versiones privadas de los objetos en versiones actuales.

para menejar estas transacciones hay funciones como por
ejemplo el commit y el rollback en Oracle, en otros gestores
de BD cambian o existen susedaneas.

Pd: parece una seccion del foro BD
__________________
"Llegado el momento supervisare my propia caida" - Alvaro Henriquez
  #3 (permalink)  
Antiguo 29/02/2004, 01:31
Avatar de Manoloweb  
Fecha de Ingreso: enero-2002
Ubicación: Monterrey
Mensajes: 2.454
Antigüedad: 15 años, 10 meses
Puntos: 5
Bueno, pues es probable que por desconocimiento.

Que clase de semaforos podrían usarse al escribir en ficheros?

__________________
Manoloweb
  #4 (permalink)  
Antiguo 02/03/2004, 14:01
 
Fecha de Ingreso: julio-2003
Mensajes: 21
Antigüedad: 14 años, 4 meses
Puntos: 0
Manoloweb no te he entendido, es que eso no se puede? Por ejemplo me gustaria saber si se puede hacer que un usario escriba en un fichero de texto y que si alguien mas quiere escribirlo tenga que experar a que el primero acabe.
  #5 (permalink)  
Antiguo 02/03/2004, 15:36
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 15 años, 11 meses
Puntos: 126
En cuanto a bloqueo de archivos para el proceso físico de lectura o escritura .. revisa la función:

flock()
http://www.php.net/manual/en/function.flock.php

Pero hay que diferenciar lo que sería ese proceso fisico de lo que sería bloquear "la aplición" entera para que si X usuario entra a leer el archivo Y o N usuarios no puedan escribir en el archivo hasta que X no libere el archivo.

Lo mismo usan las Base de datos con sus bloqueos de tablas/registros .. como más arriba ya han comentado ...


Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #6 (permalink)  
Antiguo 02/03/2004, 16:38
 
Fecha de Ingreso: febrero-2004
Mensajes: 49
Antigüedad: 13 años, 10 meses
Puntos: 0
Hola,

Yo cuando intento actualizar algún campo de una tabla siempre mando primero una sentencia sql LOCK TABLE mitabla WRITE (mas info en http://www.mysql.com/doc/en/LOCK_TABLES.html) antes de mandar el UPDATE o el INSERT (muy util cuando tengo un campo con autoincremento y despues de insertar quiero saber que valor me ha puesto a la ultima insercion).
Despues de haber el update o el insert mando otro SQL: UNLOCK TABLE....

De esta forma estoy seguro que nadie puede ver info de esta tabla mientras la estoy actualizando.
Digamos que soluciono la exclusion mutua sobre un recurso en el que hay varios lectores/escritores. (OBS: Cuando hago un select no hago LOCK TABLES mitable READ ya que no hay problema xq exitan multiples lectores, el problma es que si existe un escritor no puede haber ningun otro proceso escritor/lector ejecutandose)

un saludo
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 20:47.