sql server - tablas - Tabla de bloqueo de TransactionScope y IsolationLevel
repeatable read sql server (1)
Quiero usar TransactionScope
en mi proyecto. Lo leí y descubrí que crea una transacción implícita en la base de datos. Quiero saber si ese TransactionScope
bloquea las tablas que manipula?
Por ejemplo en este código:
using (Entities ent = new Entities())
{
using (TransactionScope tran = Common.GetTransactionScope())
{
var oldRecords = ent.tblUser.Where(o => o.UserID == UserID);
foreach (var item in oldRecords)
{
ent.tblUser.DeleteObject(item);
}
y
public static TransactionScope GetTransactionScope()
{
TransactionOptions transactionOptions = new TransactionOptions();
transactionOptions.IsolationLevel = System.Transactions.IsolationLevel.Serializable;
return new TransactionScope(TransactionScopeOption.Required, transactionOptions);
}
¿Está tblUser
bloqueado hasta que se Complete
comando?
¿ IsolationLevel
en una transacción explícita es similar a la transacción implícita?
Gracias
Es SQL Server el que hace el bloqueo, si es necesario. Cualquier operación UPDATE
o DELETE
debe obtener un bloqueo exclusivo en aquellas filas a las que afecta; si ya están bloqueadas por otra transacción, no puede hacer eso.
Por lo tanto, en su caso, si se eliminan varias filas de la base de datos, el Servidor SQL por defecto bloqueará esas filas únicamente , es decir, aquellas que se están eliminando. No bloquea toda la mesa. Esto es a menos que elimine una gran cantidad de filas a la vez: si elimina más de 5,000 filas en una sola transacción, SQL Server intentará realizar una escalada de bloqueo y bloquear toda la tabla (en lugar de mantener y administrar 5000+ cerraduras de fila individuales).
El nivel de aislamiento solo define cuánto tiempo la lectura bloqueará una fila, de manera predeterminada ( READ COMMITTED
), la fila tendrá un bloqueo compartido solo para el momento en que se lee, generalmente en muy poco tiempo. Con el nivel de aislamiento REPEATABLE READ , el bloqueo compartido se mantendrá hasta el final de la transacción actual, y SERIALIZABLE no solo bloqueará las filas que se leen, sino también los rangos enteros de filas. Pero nuevamente: eso solo afecta las operaciones de LECTURA - no tiene un impacto directo en las instrucciones DELETE
o UPDATE
(aparte de tener un bloqueo compartido en una fila, puede evitar que el DELETE
adquiera su bloqueo exclusivo que necesita)