FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour Experiencias de bloqueo de registros con ADO
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Experiencias de bloqueo de registros con ADO
Posted: Fri Aug 22, 2014 04: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
Posts: 2706
Joined: Fri Oct 07, 2005 01:50 PM
Re: Experiencias de bloqueo de registros con ADO
Posted: Fri Aug 22, 2014 01: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

Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Experiencias de bloqueo de registros con ADO
Posted: Fri Aug 22, 2014 03:46 PM
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: Experiencias de bloqueo de registros con ADO
Posted: 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
Posts: 411
Joined: Sun Jan 31, 2010 03:30 PM
Re: Experiencias de bloqueo de registros con ADO
Posted: Sat Aug 23, 2014 02: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

Posts: 694
Joined: Fri Oct 07, 2005 06:58 AM
Re: Experiencias de bloqueo de registros con ADO
Posted: 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
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
Re: Experiencias de bloqueo de registros con ADO
Posted: Mon Aug 25, 2014 03: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

Continue the discussion