2008-12-22 8 views
5

si selecciono una fila para la actualización de MS SQL Server y desea tenerlo bloqueado hasta que o bien actualizar o cancelar, qué opción es mejor: -bloqueo pesimista en T-SQL

1) Use una sugerencia de consulta como UPDLOCK 2) Use REPEATABLE READ nivel de aislamiento para la transacción 3) cualquier otra opción.

Gracias, Chak.

Respuesta

3

Ninguno. Casi nunca desea mantener abierta una transacción mientras su usuario ingresa datos. Si tiene tiene para implementar un bloqueo pesimista como este, las personas generalmente lo hacen mediante el rodaje de su propia funcionalidad.

Considere las ramificaciones completas de lo que está haciendo. Una vez trabajé en un sistema que implementó el bloqueo de esta manera. A menudo te topas con toneladas de bloqueos añejos, y tus usuarios se confunden y se enojan muy rápido cuando les pones esto en sus manos. La solución para nosotros en nuestro caso fue eliminar por completo esta funcionalidad de bloqueo.

+1

Tenga en cuenta que la situación del OP puede no tener nada que ver con la entrada de datos por parte del usuario final. – RoadWarrior

8

Si está esperando otro recurso, como un usuario final, siga los consejos de Dave Markle y no lo haga.

De lo contrario, pruebe el siguiente código de T-SQL:

BEGIN TRAN 

SELECT * 
FROM authors AU 
WITH (HOLDLOCK, ROWLOCK) 
WHERE AU.au_id = '274-80-9391' 

/* Do all your stuff here while the row is locked */ 

COMMIT TRAN 

El HOLDLOCK pista pide amablemente SQL Server para mantener el bloqueo hasta que confirme la transacción. El ROWLOCK insinúa a SQL Server que bloquee solo esta fila en lugar de emitir un bloqueo de página o tabla.

Tenga en cuenta que si se afectan muchas filas, SQL Server tomará la iniciativa y escalará a bloqueos de página, o tendrá todo un ejército de bloqueos de fila llenando la memoria de su servidor y empantanando el procesamiento.

0

solo tenga en cuenta que a pesar de utilizar ROWLOCK SQL Server puede optar por seguir teniendo un bloqueo de página completa si lo considera necesario.