Controlar la concurrencia de acceso a datos - timestamp

01/12/2005 - 21:19 por Emanuel | Informe spam
Estoy desarrollando una aplicacion en ASP.NET con c#. La aplicacion, tiene
altas , bajas y modificaciones de datos codificadas con el Data Access
Aplications Block.
Como puedo hacer para controlar la concurrencia ?
Lei algo de la implementacion de un campo de tipo timestamp en las tablas
del sql server pero no encuentro ejemplos concretos para implementar.
Si alguien tiene un comentario sera de gran ayuda
 

Leer las respuestas

#1 Jesús López
04/12/2005 - 12:56 | Informe spam
Los campos de tipo timestamp tienen la característica de que su valor cambia
cuando se modifica el registro. Lo cual puede servir de indicativo de que un
registro ha cambiado.

Para basar la detección de conflictos de concurencia optimista en campos de
tipo timestamp, la tabla tiene que tener un campo de este tipo y se debe
incluir la versión original de este campo en la cláusula where del update
command. Asímismo es necesario incluir el refresco del registro en este
commando.

Por ejemplo el update command podría ser:

UPDATE Tabla
SET Campo1 = @Campo1, Campo2 = @Campo2,
WHERE CampoClave = @CampoClave_Original AND CampoTimeStamp =
@CampoTimeStamp_Original;
SELECT Campo1, Campo2, ...
WHERE CampoClave = @CampoClave_Original

En la cláusula SET del UPDATE se incluyen todos los campos excepto los
autonuméricos y los timestamp.
En la cláusula WHERE del UPDATE se incluyen los valores originales de la
clave primaria y del campo timestamp.
En la lista de campos de la SELECT (registro de refresco) hay que incluir al
menos el campo timestamp, el resto de campos es opcional.
La cláusula WHERE de la SELECT (registro de refresco) debe incluir el valor
original de la clave primaria.

El DeleteCommand podrías incluir en la cláusula where sólo la clave primaria
si quieres que el registro se borre aunque otro usuario lo haya modificado
desde la última vez que se leyó o puedes incluir el valor original del campo
timestamp si quieres que se detecte un conflicto de concurrencia al borrar
un registro cuando otro usuario lo haya modificado desde la última vez que
se leyó:

DELETE TABLA
WHERE CampoClave = @CampoClave_Original

o

DELETE TABLA
WHERE CampoClave = @CampoClave_Original AND CampoTimeStamp =
@CampoTimeStamp_Original


El insert command siempre debería incluir registro de refresco con al menos
el campo timestamp. El siguiente insert comand es un ejemplo para una tabla
cuya clave primaria es un autonumérico:

INSERT INTO Tabla(Campo1, Campo2, ) VALUES(@Campo1, @Campo2, );
SELECT CampoTimeStamp, Id
WHERE Id = SCOPE_IDENTITY()

Si la clave primaria no es un autonumérico:

INSERT INTO Tabla(Campo1, Campo2, ) VALUES(@Campo1, @Campo2, );
SELECT CampoTimeStamp
WHERE CampoClave = @CampoClave

Saludos:

Jesús López
MVP VB






"Emanuel" escribió en el mensaje
news:
Estoy desarrollando una aplicacion en ASP.NET con c#. La aplicacion, tiene
altas , bajas y modificaciones de datos codificadas con el Data Access
Aplications Block.
Como puedo hacer para controlar la concurrencia ?
Lei algo de la implementacion de un campo de tipo timestamp en las tablas
del sql server pero no encuentro ejemplos concretos para implementar.
Si alguien tiene un comentario sera de gran ayuda

Preguntas similares