uncommitted transaction sucia repeatable read permitir lectura instantánea instantaneas committed aislamiento sql-server sql-server-2005 isolation-level read-committed-snapshot

sql-server - transaction - sql server is read committed snapshot on



¿Por qué READ_COMMITTED_SNAPSHOT no está activado de forma predeterminada? (3)

Activar la instantánea por defecto rompería la gran mayoría de las aplicaciones

No me queda claro si romperá la "gran mayoría" de las aplicaciones. O, si rompe muchas aplicaciones en formas difíciles de identificar y / o difíciles de solucionar. La documentación de SQL Server indica que READ COMMITTED y READ COMMITTED SNAPSHOT satisfacen la definición ANSI de READ COMMITTED . (Enunciado aquí: http://msdn.microsoft.com/en-us/library/ms189122.aspx ) Entonces, mientras su código no se base en algo más allá del comportamiento literal requerido por ANSI, en teoría, será bueno.

Una complicación es que la especificación ANSI no captura todo lo que las personas piensan comúnmente como lectura sucia, lectura difusa / no repetible, etc. en la práctica. Y, hay anomalías (permitidas por las definiciones ANSI) que pueden ocurrir bajo READ COMMITTED SNAPSHOT que no pueden ocurrir bajo READ COMMITTED . Para ver un ejemplo, consulte http://www.jimmcleod.net/blog/index.php/2009/08/27/the-potential-dangers-of-the-read-committed-snapshot-isolation-level/ .

También vea http://social.msdn.microsoft.com/Forums/en-US/sqldatabaseengine/thread/d1b3d46e-2642-4bc7-a68a-0e4b8da1ca1b .

Para obtener información READ_COMMITTED_SNAPSHOT sobre las diferencias entre los niveles de aislamiento, comience con http://www.cs.umb.edu/cs734/CritiqueANSI_Iso.pdf ( READ_COMMITTED_SNAPSHOT no estaba presente cuando se escribió este documento, pero los otros niveles están cubiertos por él) .

¿Pregunta simple?

¿Por qué READ_COMMITTED_SNAPSHOT no está READ_COMMITTED_SNAPSHOT de forma predeterminada?

Estoy adivinando ya sea la compatibilidad hacia atrás, el rendimiento, o ambos?

[Editar] Tenga en cuenta que me interesa el efecto relacionado con el nivel de aislamiento READ_COMMITTED, y no el nivel de aislamiento de instantáneas.

¿Por qué sería esto un cambio de ruptura, ya que mantiene menos bloqueos y aún no lee las filas no confirmadas?


Ambos. Sobre todo la compatibilidad.

Activar la instantánea por defecto rompería la gran mayoría de las aplicaciones que esperan el antiguo comportamiento de bloqueo. La instantánea hace un uso intensivo de tempdb para el almacén de versiones y su impacto en el rendimiento es bastante medible.


Cambia la estrategia de bloqueo predeterminada de cómo la familia Sybase / SQL Server ha funcionado para siempre. Rompería todas mis aplicaciones, todas las aplicaciones que conozco en mi tienda y dañaría una gran cantidad de datos importantes.

Lea el artículo de Wikipedia por completo : ¿desea que el código detrás de su aplicación bancaria utilice este modelo de aislamiento?

En general, por lo tanto, el aislamiento de instantáneas plantea parte del problema de mantener restricciones no triviales sobre el usuario, que puede no apreciar los riesgos potenciales o las posibles soluciones. La ventaja de esta transferencia es un mejor rendimiento.

Es un compromiso como la mayoría de los diseños de bases de datos. En mi caso, puedo lidiar con las esperas / puntos muertos de bloqueo (raro) como un precio para una integridad de datos más fácil y más "lista para usar". Todavía tengo que encontrar un problema o un problema en el que veo el aislamiento de instantáneas como una solución.