none
Deadlocks isolation levesls read committed and read uncommitted RRS feed

  • Pregunta

  • Buenas, estoy desarrollando una aplicacion en ASP.NET MVC y SQL SERVER, y se me solicita contemplar en que casos se puede dar un deadlock con los diferentes niveles de aislamiento, me duda es, como se puede lograr producir un deadlock con los niveles read committed y read uncommitted?
    miércoles, 29 de abril de 2020 14:36

Todas las respuestas

  • hola

    No deberia haber deadlock en un desarrollo web

    Los bloqueos se producen cuando te mentienes conectado a la db realizando actualizacioens masivas de datos, si solo vas a conectarte realizar una operacion simple en una o varias tablas y luego desconectarte en ese caso es improbable que se generen lockeos que puedan afectar las operaciones

    Se supone que las transacciones las trabajas desde codigo .net con lo cual deberian ser tan pequeñas como la duracion de un request

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 29 de abril de 2020 18:04
  • Veamos cómo puedes provocar un deadlock a mano, para que sepas cómo funciona.

    Primero, crea dos tablas de prueba para hacer el experimento:

    create table prueba1 ( campo1 int ) insert prueba1 values (1)
    create table prueba2 ( campo1 int ) insert prueba2 values (1)

    Después abre una conexión a SQL Server y ejecuta esto:

    set transaction isolation level READ COMMITTED
    begin transaction
    update prueba1 set campo1=2

    Ahora, sin cerrar la conexión anterior, abre otra segunda conexión y ejecuta lo siguiente (observa que no es idéntico a lo de la primera conexión, ya que ahora estamos usando la otra tabla):

    set transaction isolation level READ COMMITTED
    begin transaction
    update prueba2 set campo1=2

    Ahora vuelve a la primera conexión y ejecuta esto:

    update prueba2 set campo1=2

    Se quedará "atascado" ejecutándolo, no puede terminar de ejecutar la sentencia porque la tabla prueba2 está bloqueada por el update que hiciste en la conexión2.

    Ahora vuelve a la conexión 2 y ejecuta esto:

    update prueba1 set campo1=2

    Igual que en el caso anterior, se quedará "atascado" porque no puede modificar la tabla 1 debido a que está bloqueada por la conexión 1.

    Ahora tenemos las dos conexiones bloqueadas, porque cada una de ellas está esperando a que termine la otra. Esto se llama un Deadlock.

    Al cabo de 5 segundos, SQL Server interrumpirá una de las dos operaciones y dará un Error 1205 indicando el Deadlock. Esto permite que la otra termine, pero la víctima del Deadlock dará un error.

    Y sí, con read uncommited también da error.

    Entonces, ¿esto podría ocurrir en una aplicación MVC? Sí, es posible si la aplicación tiene mucho tráfico. Si por casualidad se reciben en el servidor dos peticiones simultáneas de forma que una de ellas modifica las tablas A y B y la otra modifica B y A, entonces si da la casualidad de que se ejecutan ambas justo a la vez se produciría un deadlock.

    Por supuesto, la probabilidad de que coincidan justo a la vez es tanto menor cuanto más breves sean las operaciones, que es lo que te estaban recomendando en una respuesta anterior.


    jueves, 30 de abril de 2020 12:40