Tipo Concurrencia y Nivel de Aislamiento en Transacciones


Tipos de Concurrencia de Transacciones

  • Optimista: Deja realizar modificaciones de los datos y se persisten (commitado). Cuando se van a persistir se verifica que no se han modificado por otras transacciones simultáneamente; en cuyo caso produce un error. Más información del Patrón Optimista.
  • Pesimista: Para los datos modificados, realizar un bloqueo de los mismos. Impendiendo que otras transacciones realicen cambios de esos datos. Más información del Patrón Pesimista.

Tipos de Nivel de Aislamiento de Transacción

  • READ UNCOMMITTED: Leen valores modificados por otras transacciones no persisitidos (commitados).
  • READ COMMITTED: No dejan leer valores modificados por otras transacciones no persisitidos (commitados). READ COMMITTED al releer datos que se han comitado por otra transacción durante la ejecución de la propia; obtiene valores diferentes.
  • READ_COMMITTED_SNAPSHOT: Evita el problema del READ COMMITED. Crea un estado en la base de datos; de esta manera la transacción lee los datos referidos a ese estado. No impide que otras transacciones modifiquen los datos leidos por la nuestra.
  • REPEATABLE READ: Evita el problema del READ COMMITED. REPEATABLE READ evita que otra transacción modifique los datos modificados por nuestra transacción. Dado que los datos leídos; pueden depender de lo realizado en la otra transacción.
  • SERIALIZABLE: REPEATABLE READ que además se extiende para inserciones.

Transacciones en SQL SERVER

En SQL Server el tipo de concurrencia es pesimista. El bloqueo se activa al modificar los datos; no al leerlos. Si queremos activarlo en su lectura con debemos usar la clausula WITH UPDLOCK.

SELECT * FROM TABLE WITH(UDPLOCK) WHERE ID = 1

El nivel del Aislamiento en SQL SERVER se indica con la instrucción SET TRANSACTION ISOLATION LEVEL. Por defecto es READ COMMITTED.
En SQL SERVER cuando indicamos READ COMMITTED, puede ser READ COMMITTED o READ COMMITED SNAPSHOT. Esto se determina en función de la configuración de la base de datos:

  • READ COMMITED SNAPSHOT: La base de datos se encuentra con la configuración SET READ_COMMITTED_SNAPSHOT ON.
  • READ COMMITTED: La base de datos se encuentra con la configuración SET READ_COMMITTED_SNAPSHOT OFF

En SQL AZURE solo existe READ COMMITTED SNAPSHOT. No se puede desactivar con la configuración SET READ_COMMITTED_SNAPSHOT OFF.

Transacciones en Otros Entornos

En Entity Framework, LINQ, DataSet,… el tipo de concurrencia es optimista.
En NHibernate, por defecto tiene concurrencia optimista. Pero se puede habilitar concurrencia pesimista.
En general, se recominda el uso del TransactionScope, para determinar el nivel de aislamiento con TransactionScopeOption .

Ejemplo de Transacciones

En el siguiente link, esta disponible un proyecto de ejemplo:ConcurrencyAndIsolationOnTransaction.sln
El proyecto, genera dos transacciones concurrentes que incrementan en uno el mismo campo de una tabla de la base de datos. En función del Nivel de Aislamiento (READ COMMITED o REPETIBLE READ) y el Entrono (Entitiy Framework, SQL o SQL con Concurrencia Pesimista en Lectura). Se obtiene:

9:ENTITY ReadCommitted -
     9:Initial Value=1
          11:ReadValue=1
          11:Incrementing to2
          12:ReadValue=1
          12:Incrementing to2
          11:Saving
          11:Commit
          12:Saving
          12:Commit
     9:Final Value=2
9:SQL ReadCommitted
     9:Initial Value=1
          12:ReadValue=1
          12:Incrementing to2
          11:ReadValue=1
          11:Incrementing to2
          12:Saving
          12:Commit
          11:Saving
          11:Commit
     9:Final Value=2
9:SQLUpdLock ReadCommitted
     9:Initial Value=1
          14:ReadValue=1
          14:Incrementing to2
          14:Saving
          14:Commit
          11:ReadValue=2
          11:Incrementing to3
          11:Saving
          11:Commit
     9:Final Value=3
9:ENTITY RepeatableRead -
     9:Initial Value=1
          12:ReadValue=1
          12:Incrementing to2
          11:ReadValue=1
          11:Incrementing to2
          12:Saving
          11:An error occurred while updating the entries. See the inner excepti
on for details.
          12:Commit
     9:Final Value=2
9:SQL RepeatableRead
     9:Initial Value=1
          12:ReadValue=1
          12:Incrementing to2
          13:ReadValue=1
          13:Incrementing to2
          12:Saving
          13:Transaction (Process ID 68) was deadlocked on lock resources with a
nother process and has been chosen as the deadlock victim. Rerun the transaction
.
          12:Commit
     9:Final Value=2
9:SQLUpdLock RepeatableRead
     9:Initial Value=1
          13:ReadValue=1
          13:Incrementing to2
          13:Saving
          13:Commit
          12:ReadValue=2
          12:Incrementing to3
          12:Saving
          12:Commit
     9:Final Value=3
Anuncios
Esta entrada fue publicada en Azure, Desarrollo, Sql Server y etiquetada . Guarda el enlace permanente.

Una respuesta a Tipo Concurrencia y Nivel de Aislamiento en Transacciones

  1. Pingback: Azure Redis Cache | Pensando bajo la lluvia

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s