Esta es una pregunta de seguimiento de: /programming/7684477/is-it-possible-to-set-transaction-isolation-level-snapshot-automatically
Sin embargo, todavía tengo situaciones de punto muerto / tiempo de espera en la aplicación ASP.NET cuando ejecuto grandes informes simultáneamente READ_COMMITTED_SNAPSHOT ON
.
Entonces tengo dos preguntas:
- ¿Cómo puedo verificar si la Instantánea de nivel de aislamiento de transacción funciona como se esperaba / en absoluto?
- Supongo que las claves externas (en las tablas de la aplicación web para las tablas de informes) son responsables de los puntos muertos. Encontré este interesante artículo :
Nota SQL Server adquiere bloqueos compartidos al validar claves foráneas, incluso si la transacción está utilizando una instantánea confirmada de lectura (lectura confirmada utilizando el control de versiones de fila) o un nivel de aislamiento de instantánea. Tenga esto en cuenta al examinar los gráficos de punto muerto de las transacciones cuando se utilizan estos niveles de aislamiento de transacciones. Si ve bloqueos compartidos, verifique si los bloqueos se toman en un objeto al que hace referencia una clave foránea.
¿Cómo puedo verificar si los FK son realmente responsables de las situaciones de punto muerto / tiempo de espera, eso significa que podría eliminar esas claves foráneas para evitar puntos muertos (lo que sería un esfuerzo aceptable)?
Nota : Solo estoy leyendo de las tablas que causan puntos muertos.
Cualquier idea sobre este tema es muy apreciada.
Editar aquí es un gráfico de punto muerto . Quizás alguien podría ayudarme a comprender qué causa el punto muerto. Parece que ocurrió sin que se ejecutaran informes solo causados por la aplicación web, cuando dos transacciones desean escribir la misma tabla (una actualización y una inserción, la inserción es como Procedimiento almacenado). ¿Por qué adquiere bloqueos de página y cómo habilitar solo bloqueos de fila? El Insert-SP ya lo usa TRANSACTION ISOLATION LEVEL REPEATABLE READ
.
Tengo una fuerte sospecha de que dos factores desencadenantes (una actualización y una inserción) son responsables de los puntos muertos. Aquí está el disparador de inserción:
CREATE TRIGGER [dbo].[CreateRMAFiDates]
ON [dbo].[RMA]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
UPDATE RMA
SET [fiCreationDate]=(SELECT idDate FROM tdefDate
WHERE CONVERT(VARCHAR, INSERTED.Creation_Date, 112) = tdefDate.Text),
[fiPopDate]=(SELECT idDate FROM tdefDate
WHERE CONVERT(VARCHAR, INSERTED.POP_Date, 112) = tdefDate.Text),
[fiManufactureDate]=(SELECT idDate FROM tdefDate
WHERE CONVERT(VARCHAR, INSERTED.Manufacture_Date, 112) = tdefDate.Text)
FROM INSERTED;
END
Entonces, este activador actualiza la tabla RMA, lo que hace que se active el activador de actualización (lo que hace similar). ¿El gráfico de punto muerto confirma mi suposición? Creo que eliminaré esos disparadores y crearé un SP que se ejecuta una vez al día, lo que sería perfectamente suficiente, porque estas columnas son solo para un Cubo SSAS (Molap).
Editar : Por cierto, ya no hubo un punto muerto desde que eliminé estos desencadenantes :)
fuente