Experiencias de bloqueo de registros con ADO

Experiencias de bloqueo de registros con ADO

Postby Antonio Linares » Fri Aug 22, 2014 4:25 am

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
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Experiencias de bloqueo de registros con ADO

Postby Rick Lipkin » Fri Aug 22, 2014 1:19 pm

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
Rick Lipkin
 
Posts: 2618
Joined: Fri Oct 07, 2005 1:50 pm
Location: Columbia, South Carolina USA

Re: Experiencias de bloqueo de registros con ADO

Postby Antonio Linares » Fri Aug 22, 2014 3:46 pm

regards, saludos

Antonio Linares
www.fivetechsoft.com
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain

Re: Experiencias de bloqueo de registros con ADO

Postby Daniel Garcia-Gil » Sat Aug 23, 2014 12:24 pm

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
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: Experiencias de bloqueo de registros con ADO

Postby russimicro » Sat Aug 23, 2014 2:23 pm

// 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
russimicro
 
Posts: 225
Joined: Sun Jan 31, 2010 3:30 pm
Location: Bucaramanga - Colombia

Re: Experiencias de bloqueo de registros con ADO

Postby fgondi » Sun Aug 24, 2014 12:49 pm

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 estos casos, 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 Sistemas Informáticos
User avatar
fgondi
 
Posts: 694
Joined: Fri Oct 07, 2005 6:58 am
Location: Palencia, España

Re: Experiencias de bloqueo de registros con ADO

Postby Antonio Linares » Mon Aug 25, 2014 3:51 am

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
User avatar
Antonio Linares
Site Admin
 
Posts: 41314
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 39 guests

cron