Experiencias de bloqueo de registros con ADO

Post Reply
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Experiencias de bloqueo de registros con ADO

Post by Antonio Linares »

Me gustaría iniciar una conversación para comentar la forma en la que manejais el bloqueo de registros con ADO.

La pregunta es simple:

Digamos que teneis un registro, y que necesitais editarlo y que mientras lo editais, otros usuarios no deben ser capaces de modificarlo.

Como estais controlando esta situación ?

Agradezco vuestros comentarios
regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Rick Lipkin
Posts: 2397
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA

Re: Experiencias de bloqueo de registros con ADO

Post by Rick Lipkin »

Antonio

See my response in the English forum...I use a numeric signature value in my tables and increment them +1 each time I edit a record.

If you have two people accessing the same record at the same time .. before I Update() my Edit, I have a routine that goes out and opens a new recordset ( just ) on my signature value for that unique row ( your primary key ) . If the values are the same .. I update the record incrementing the signature value +1. If I find the Signature record is not the same .. that means someone else modified the record before I did and at that point I through up an Alert saying that the current record has changed and stop the edit.

Rick Lipkin
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Experiencias de bloqueo de registros con ADO

Post by Antonio Linares »

regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Daniel Garcia-Gil
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita
Contact:

Re: Experiencias de bloqueo de registros con ADO

Post by Daniel Garcia-Gil »

Antonio

Esta practica es usada solo en procesos transaccionales, no depende de ADO o de un API, depende del motor de bases de datos que uses, puedes mantener un registro bloqueado mientras espera ser usado, se que funciona con Mysql (y derivados de el) oracle y postgres

siempre se debe comenzar la transaccion

BEGIN

buscar el registro a usar

SELECT * FROM MyTabla WHERE id=MyId FOR UPDATE

con la clausula FOR UPDATE es donde sucede toda la magia, otras conexiones no podran hacer uso del registro hasta que termine la transaccion, si el registro es bloquedo por mucho tiempo el motor retorna una excepcion

ROLLBACK / COMMIT para terminar la transaccion

ahora no se si buscas alga mas general y que tambien funcione en motores que no usen SQL
our best documentation is the source code
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
russimicro
Posts: 179
Joined: Sun Jan 31, 2010 3:30 pm
Location: Bucaramanga - Colombia

Re: Experiencias de bloqueo de registros con ADO

Post by russimicro »

// MANEJO DE BLOQUEO DE MULTIPLES TABLAS CON PHP_PDO
// LA TAREA ES BUSCAR EL EQUIVALENTE CON ADO.....

$conn->beginTransaction();
bloqueaTablaConsecutivo($conn,1) ;

// procesos ... insert , update , delete ,,,, etc

$conn->commit();
bloqueaTablaConsecutivo($conn,0) ;

//*******************************

function bloqueaTablaConsecutivo($conn,$lBloTab) {
$cSenEje = "UNLOCK TABLES;";
if ( $lBloTab == 1 ) {
$cSenEje = "LOCK TABLES consecutivos AS sec WRITE, transainventarios WRITE, conceptosinventarios AS con WRITE;";
};
$stmt=$conn->prepare($cSenEje);
$stmt->setFetchMode(PDO::FETCH_ASSOC);
$stmt->execute();
$registros = $stmt->rowCount();
unset($stmt);
}

//*************************************************************

Johnson Russi
User avatar
fgondi
Posts: 636
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España
Contact:

Re: Experiencias de bloqueo de registros con ADO

Post by fgondi »

En mi caso, sólo bloqueo el registro en el momento del update.
En ese momento genero una transacción, la cual bloquea los registros hasta el momento de commit.


Otra situación es si un usuario machaca la información grabada otro.
Ejemplo: modificar el teléfono de un cliente 2 usuarios a la vez y la grabación se produce en momentos distintos.

Teléfono estado inicial: 1234
Usuario 1 cambia el teléfono a: 5678
Usuario 2 cambia el teléfono a: 9058

Resultado el primero cambia el teléfono sin problemas y el segundo cuando pulsa el botón de grabar, desconoce que el dato ya ha sido cambiado por otro usuario.

Lo que hago para evitar _, es verificar si el valor a cambiar (el teléfono del cliente) sigue en el mismo valor que tenía el comenzar la modificación (1234),
sino tiene el mismo valor, se lo informo al usuario del nuevo cambio, avisando el valor inicial (1234) y el nuevo valor (5678).
Un saludo
Fernando González Diez
ALSIS GHE Sistemas Informáticos
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Re: Experiencias de bloqueo de registros con ADO

Post by Antonio Linares »

Daniel,
Daniel Garcia-Gil wrote: SELECT * FROM MyTabla WHERE id=MyId FOR UPDATE

con la clausula FOR UPDATE es donde sucede toda la magia, otras conexiones no podran hacer uso del registro hasta que termine la transaccion, si el registro es bloquedo por mucho tiempo el motor retorna una excepcion

ROLLBACK / COMMIT para terminar la transaccion
Gracias, esto parece una muy buena solución :-)
regards, saludos

Antonio Linares
www.fivetechsoft.com
Post Reply