Problema de concurrencia de Http Handler / Azure SQL

.net azure dapper iis sql-server

Pregunta

Tengo la siguiente situación, una aplicación web, que se ejecuta en IIS en Azure App Service . Dicha aplicación, se conecta a una base de datos en Azure Sql para actualizar los registros en una tabla. Mi problema es que dos llamadas realmente muy cercanas parecen llamar a INSERT sobre la mesa dos veces con la misma tecla, y ambas tienen éxito.

Ahora, los detalles son:

Esquema de SQL: Notification Id => uniqueidentifier (unique key) Status => int

Mi aplicación web es IHttpHandler habitual y el código está a continuación.

    <!-- language: c# -->
    public class NotificationStatus : IHttpHandler
    {
        internal class Notification
        {
            public Guid Id { get; set; }
            public int Status { get; set; }

            SqlConnection Connection; /* Not mapped for obvious reasons */
        }

        public void ProcessRequest(HttpContext context)
        {
            Guid id = GetFromContext(context, "id");
            int status = GetFromContext(context, "status");

            Notification not = Db.RetrieveRow(id); /* Create connection from pool */

            try
            {
                if (not == null)
                {
                    not = new DbRecord
                    {
                        Id = id,
                        Status = status,
                    };

                    Db.InsertRow(not); /* Create connection from pool */
                }
                else
                {
                    if (status > not.Status) /* Prevent setting a minor status */
                    {
                        not.Status = status
                        Db.UpdateRecord(not); /* Use connection attached to the object */
                    }
                }

                context.Response.Write("ok");
            }
            catch (Exception ex)
            {
                context.Response.Write(ex.Message);
            }
        }
    }

El Db es un simple contenedor de la biblioteca Dapper .

Entonces, la solicitud fue:

  1. http://myapp.net/notificationstatus.ashx?id=a58441ae-28ac-48f5-ba5a-730060863f17&status=3

  2. http://myapp.net/notificationstatus.ashx?id=a58441ae-28ac-48f5-ba5a-730060863f17&status=1

Al final, el registro en el db muestra el Status = 1 , y ambas solicitudes se devuelven bien , lo que no debería suceder. En este punto, no tengo idea de lo que está pasando, hasta donde yo sé, IIS ejecuta cada solicitud en el hilo, no hay nada compartido allí. SqlConnections se recuperan de un grupo, por lo que dudo que se compartan allí.

¿Alguien sabe lo que podría estar pasando aquí?

Respuesta popular

Al final, el registro en el db muestra el estado = 1, y ambas solicitudes se devuelven bien, lo que no debería suceder.

En primer lugar, de acuerdo con su código, podríamos encontrar que si el código no causa una excepción al procesar la solicitud en el método ProcessRequest, este código context.Response.Write("ok"); siempre se ejecutará, por lo que la respuesta es correcta .

En segundo lugar, puede depurar remotamente el código para rastrear el objeto Notification y el estado de la variable para verificar lo que realmente está ocurriendo mientras procesa dos solicitudes, y asegurarse de que el estado de status > not.Status pueda cumplirse y status > not.Status una operación de actualización.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué