sql-server ajax coldfusion cqrs

sql server - ¿Solución para evitar el bloqueo de DB en ColdFusion?



sql-server ajax (1)

Aquí están mis pensamientos sobre esto.

Desde el lado del servidor ColdFusion

Creo que el uso de etiquetas <cflock> con nombre alrededor de su código ColdFusion que actualiza la base de datos podría evitar el problema de interbloqueo en el servidor de la base de datos. Usar un bloqueo con nombre haría que cada llamada tenga un solo hilo. Sin embargo, puede ejecutar tiempos de espera en el servidor ColdFusion, esperando el <cflock> , si las transacciones <cflock> un poco. Manejarlo de esta manera en el lado del servidor ColdFusion también puede ralentizar su aplicación. Podría hacer algunas pruebas de carga antes y después para ver cómo este método afecta su aplicación.

Desde el lado del servidor de la base de datos

En primer lugar, permítanme decir que no creo que los bloqueos en el servidor de la base de datos se puedan evitar completamente, simplemente se minimicen y se manejen adecuadamente. Encontré esta referencia en TechNet para usted: Minimizar los bloqueos . La primera oración de esa página:

Aunque los bloqueos no se pueden evitar por completo, seguir ciertas convenciones de codificación puede minimizar la posibilidad de generar un interbloqueo.

Aquí están los puntos clave de esa referencia. Explican un poco más de detalle sobre cada tema, así que lea la fuente original.

Minimizar los interbloqueos puede aumentar el rendimiento de la transacción y reducir la sobrecarga del sistema porque menos transacciones son:

  • Revertido, deshaciendo todo el trabajo realizado por la transacción.
  • Reenviado por las aplicaciones porque se revierten cuando están bloqueadas.

Para ayudar a minimizar los bloqueos:

  • Accede a objetos en el mismo orden.
  • Evite la interacción del usuario en las transacciones.
  • Mantenga transacciones cortas y en un lote.
  • Use un nivel de aislamiento más bajo.
  • Utilice un nivel de aislamiento basado en el control de versiones de filas.
    • Establezca la opción de base de datos READ_COMMITTED_SNAPSHOT en ON para habilitar las transacciones de confirmación de lectura para usar el control de versiones de filas.
    • Use aislamiento de instantáneas.
  • Use conexiones enlazadas.

El "nivel de aislamiento basado en el control de versiones de filas" puede responder a su pregunta. ¿ O hay alguna manera de pedirle a SQL Server que bloquee una Fila en lugar de una Tabla? . Hay algunas notas mencionadas en la fuente original con respecto a esta opción.

Aquí hay algunas otras referencias que surgieron durante mi búsqueda:

Evitar el interbloqueo mediante el uso de la sugerencia de NOLOCK

Cómo evitar sql deadlock?

Consejos para evitar interbloqueos? - Este menciona ser cuidadoso al usar la pista de NOLOCK .

La dificultad con los callejones sin salida

Usar niveles de aislamiento basados ​​en versiones de filas

Una aplicación en la que estoy trabajando tiene que manejar muchas solicitudes ajax que necesitan actualizar algunos datos en DB.

[Macromedia] [SQLServer JDBC Driver] [SQLServer] Transaction (Process ID 66) se estancó en el bloqueo | recursos de búfer de comunicación con otro proceso y se ha elegido como la víctima de interbloqueo. Vuelva a ejecutar la transacción.

Para las lecturas, ya utilicé la WITH (NOLOCK) y eso evitó muchos deadlocks en las lecturas.

¿Qué puedo hacer para manejar mejor las escrituras?

CF ¿Bloquear el código de actualización en CF?

¿O hay alguna manera de pedirle a SQL Server que bloquee una fila en lugar de una tabla?

¿Alguien ha tratado de implementar CQRS? Parece que resuelve el problema, pero no tengo claro cómo manejarlo:

  1. Generación de ID (ahora usa Auto Increment en DB)
  2. Cómo lidiar con la solicitud de actualización falla si el servidor no pudo enviar el error de vuelta al cliente de inmediato.

Gracias