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
Experiencias de bloqueo de registros con ADO
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
- 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
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
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
- Antonio Linares
- Site Admin
- Posts: 37481
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Contact:
- 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
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
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
Isla de Margarita Venezuela.
danielgarciagil@gmail.com
http://tdolphin.blogspot.com/
https://www.dropbox.com/referrals/NTI5N ... rc=global9
-
- Posts: 179
- Joined: Sun Jan 31, 2010 3:30 pm
- Location: Bucaramanga - Colombia
Re: Experiencias de bloqueo de registros con ADO
// 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
// 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
Re: Experiencias de bloqueo de registros con ADO
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).
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
Fernando González Diez
ALSIS GHE Sistemas Informáticos
- 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
Daniel,
Gracias, esto parece una muy buena soluciónDaniel 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