Class to manager MYSQL for Harbour/xHarbour
Custom Search

jueves, 22 de julio de 2010

Bloquear Registros / Record Lock

Existen funciones de bloqueo, pero a razon de consulta, no existen funciones de bloqueo de registro solo para bloquear tablas ( LOCK TABLES/UNLOCK TABLES ), lo que se hace es simular un bloqueo
There are functions to lock, but at the rate of consult, there is no record locking features to lock tables only LOCK TABLES/UNLOCK TABLES ),  is done is to simulate a lock

GET_LOCK( str, interval )
Intenta obtener un bloqueo con un nombre dado por la cadena str, con intervalo de espera interval en segundos. Retorna 1 si el bloqueo se obtiene con éxito, 0 si el intento ha agotado el tiempo (por ejemplo, porque otro cliente ya ha bloqueado el nombre), o NULL si ocurre un error. Si hay un bloqueo obtenido con GET_LOCK (),  se libera cuando se ejecuta RELEASE_LOCK (). 
Podra ejecutar una nueva GET_LOCK (),  despues de liberarlo o cuando su conexión termina (ya sea normal o anormal). Los bloqueos obtenidos con GET_LOCK () no interactúan con las transacciones. Es decir, confirmar una transacción no libera los bloqueos que haya obtenido en la transacción.
Esta función se puede utilizar para implementar bloqueos de aplicaciones o simular bloqueo de registros. Los nombres se bloquean en el servidor. Si un nombre ha sido bloqueada por un cliente, GET_LOCK () bloquea cualquier petición de otro cliente para bloquear con el mismo nombre. Es recomendable para estas situaciones hacer bloqueos dbname.str
Try to get a lock with a name given by the string str, with timeout interval in seconds. Returns 1 if the lock was  successfully, 0 if the attempt timed out (for example, because another client has already locked the name), or NULL if an error occurs. If there is a lock obtained with GET_LOCK (), is released when running RELEASE_LOCK ().
GET_LOCK() can run again, after release or when your connection is terminated (either normal or abnormal). The locks obtained with GET_LOCK () does not interact with transactions. That is, committing a transaction does not release the locks it has obtained in the transaction.
This feature can be used to implement application locks or to simulate record locks. The names are locked on the server. If a name has been blocked by a client, GET_LOCK () locks any request by another client for a lock with the same name. It is advisable for these situations to lock dbname.str


RELEASE_LOCK( str )
Libera el bloqueo asignado a la cadena str obtenida con  GET_LOCK (). Retorna 1 si el bloqueo se libera, 0 si el bloqueo no fue establecido por este hilo (en cuyo caso el bloqueo no se libera), y NULL si el nombre de bloqueo no existiera.
Releases the lock assigned to the string obtained GET_LOCK() str. Returns 1 if the lock was released, 0 if the lock was not established by this thread (in which case the lock is not released) and NULL if the lock name does not exist

Ejemplo/Sample:
si queremos bloquear un registro en la tabla customer,  customer.ID = 4
if we want lock a record in customer table, customer.ID = 4
SELECT GET_LOCK( 'customer.4', 120 )

usando en Dolphin / using Dolphin
oQry = oServer:Query( "SELECT GET_LOCK( 'customer.4', 120 ) AS locked" )
? oQry:locked
oQry = oServer:Query( "SELECT RELEASE_LOCK( 'customer.4' ) AS unlocked" )
? oQry:unlocked

IS_FREE_LOCK( str )
Comprueba si el nombre de bloqueo str está libre para uso. Retorna 1 si el bloqueo está libre (nadie lo  esta usando), 0 si el bloqueo está en uso, y NULL si se produce un error (como argumentos incorrectos).
Checks whether the lock named str is free to use. Returns 1 if the lock is free (no one is using the lock), 0 if the lock is in use, and NULL if an error occurs (such as an incorrect argument).

IS_USED_LOCK( str )
Comprueba si el nombre de bloqueo str está en uso. Si es así, devuelve el identificador de conexión del cliente que tiene el bloqueo.De lo contrario, devuelve NULL.
Checks whether the lock named str is in use. If so, it returns the connection identifier of the client that holds the lock. Otherwise, it returns NULL.

2 comentarios:

  1. Daniel,

    Por lo que entiendo entonces, se puede conseguir el mismo efecto ni que simules el bloqueo. El servidor nos dara un true/false el hecho de simular dicha accion.
    Que diferencia a nivel logica de aplicacion tendria un ?:

    (cAlias)->( DbSeek(4))
    (aAlias)->(Rlock())
    de un
    oMysql:Rlock( 'CUSTOMER.4')

    Entiendo entonces que podriamos utilizar el mismo concepto...


    Interesante... :-)

    ResponderEliminar
  2. El signo de interrogacion simplemnetre muestra en pantalla el contenido de la variable

    ResponderEliminar