2012-09-17 33 views
5

Tengo una base de datos SQL con una tabla que me gustaría bloquear. Estoy usando Entity Framework. Básicamente, hay una serie de procesos que cada uno desea escribir en la base de datos al mismo tiempo. Cada uno de ellos quiere actualizar una fila en alguna tabla. Sin embargo, solo quiero que uno de ellos pueda hacer esto al mismo tiempo.Bloqueo de tablas en Entity Framework

¿Hay alguna forma de bloquear una tabla completa, por ejemplo, para evitar que alguien coloque filas nuevas o actualice filas?

Gracias, Cristiano

+2

Ese es el comportamiento predeterminado.No debería tener que hacer nada, aparte de usar transacciones, si está cambiando varias tablas en una operación –

Respuesta

2

No es claro para mí qué que usted quiere esto, pero si usted realmente quiere bloquear toda la tabla, usted podría:

  • Apague fila y bloqueo de páginas para que todo se intensifica a una tabla bloquear

Ejemplo adaptado de here:

ALTER INDEX [MyIndexName] ON [dbo].[MyTableName] SET (ALLOW_ROW_LOCKS = OFF, ALLOW_PAGE_LOCKS = OFF) 

Nota: esto supone su aplicación exclusivamente "dueño" de estas tablas - no querrían aplicar este y romper alguna otra aplicación

  • estilo a tus consultas a utilizar el nivel de aislamiento serializable

Ejemplo adaptado de here:

TransactionOptions topt = new TransactionOptions(); 
topt.IsolationLevel = System.Transactions.IsolationLevel.Serializable; 
using (var tran = new TransactionScope(TransactionScopeOption.Required, topt)) { 
    //do stuff 
} 
+0

, sí, eso era lo que estaba buscando. ¡Gracias! – Christian

0

De la breve descripción, es dudoso que un bloqueo de tabla sea realmente lo que se necesita para resolver este problema. Algunas soluciones comunes que son mucho más escalables incluyen:

1) Cree una transacción serializable que lea o actualice el registro de interés como la primera instrucción. Todas las actualizaciones deberían intentar seguir este patrón.

2) Cree una transacción read_committed como (1) pero incluya una capacidad de volver a leer/reintentar en una excepción de concurrencia.

Es raro que alguna vez deba bloquear una mesa. Un caso puede ser necesario cuando hay algún cálculo involucrado para un valor de campo de identidad determinado manualmente y una posibilidad de colisión con otra sesión.

Para simplemente llame, se puede crear una transacción y la tabla bloqueada al principio. El bloqueo puede ser "X" (exclusivo) para evitar lecturas y escrituras, o no exclusivo, para evitar las escrituras. Esta respuesta, con un SP:

SO #3662766

Como alternativa, un bloqueo de la aplicación también se podría utilizar.

sp_getapplock

Cuestiones relacionadas