sql-server - transaction - set uncommitted read in sql server
Lectura del nivel de aislamiento de instantáneas Snapshot VS comprometido (4)
Aún relevante, comenzando con los comentarios de Bill, leí más y tomé notas que podrían ser útiles para otra persona.
Por defecto, las declaraciones individuales (incluido "SELECT") funcionan con datos "comprometidos" (READ COMMITTED), la pregunta es: ¿esperan que los datos estén "inactivos" y evitan que otros funcionen al leer?
Configurando con el botón derecho, haga clic en DB "Propiedades -> Opciones -> Varios":
Concurrencia / Bloqueo: es la captura confirmada de lectura activada [el ajuste predeterminado está desactivado, debe estar activado]:
- Use SNAPSHOT para seleccionar (leer), no espere otros, ni los bloquee.
- Operación de efectos sin cambio de código
- ALTER DATABASE SET READ_COMMITTED_SNAPSHOT [ON | OFF]
- SELECCIONE el nombre, is_read_committed_snapshot_on FROM sys.databases
Consistencia: Permitir el aislamiento de instantáneas [predeterminado, discutible - OK desactivado]:
- Permita que el cliente solicite SNAPSHOT a través de declaraciones SQL (transacciones).
- El código debe solicitar instantáneas de "transacción" (como SET TRANSACTION ...)
- ALTER DATABASE SET ALLOW_SNAPSHOT_ISOLATION [ON | OFF]
- SELECCIONE el nombre, is_read_committed_snapshot_on FROM sys.databases
A la pregunta: no es uno u otro entre Read Committed Snapshot y Allow Snapshot Isolation. Son dos casos de Instantánea y pueden activarse o desactivarse de forma independiente, y Permitir el aislamiento de instantáneas es un tema más avanzado. Permitir el aislamiento de instantáneas permite que el código vaya un paso más allá controlando la foto instantánea.
El problema parece claro si piensas en una fila: de manera predeterminada, el sistema no tiene copia, por lo que un lector tiene que esperar si alguien más está escribiendo, y un escritor también tiene que esperar si alguien más está leyendo: la fila debe bloquear todo el hora. Habilitar "Is Read Committed Snapshot On" activa el DB para admitir "copias de instantáneas" para evitar estos bloqueos.
Divagando...
En mi opinión, "Is Read Committed Snapshot On" debería ser "TRUE" para cualquier base de datos MS SQLServer normal, y que es una optimización prematura que envíe "FALSE" por defecto.
Sin embargo, me dicen que el bloqueo de una fila empeora no solo porque puede direccionar varias filas en las tablas, sino porque en SQL Server los bloqueos de fila se implementan usando bloqueos de nivel "de bloque" (bloqueando filas aleatorias asociadas por proximidad de almacenamiento) y eso hay un umbral donde los bloqueos múltiples desencadenan el bloqueo de la tabla, presumiblemente optimizaciones de rendimiento más "optimistas" a riesgo de bloquear problemas en bases de datos ocupadas.
¿Podría alguien ayudarme a entender cuándo usar el nivel de aislamiento SNAPSHOT sobre READ COMMITTED SNAPSHOT en SQL Server?
Entiendo que, en la mayoría de los casos, LEA COMPROBADO QUE SNAPSHOT funciona, pero no está seguro de cuándo instalar SNAPSHOT.
Gracias
No se puede comparar Snapshot Read Snap-Committed sin una discusión sobre la temida excepción de "snapshot update conflict" que puede ocurrir en Snapshot, pero no Snapshot Read Committed.
En pocas palabras, el aislamiento de instantáneas recupera una instantánea de los datos comprometidos al comienzo de una transacción , y luego utiliza un bloqueo optimista para las lecturas y escrituras. Si, al intentar comprometer una transacción, resulta que algo más cambió algunos de los mismos datos, la base de datos revertirá la transacción completa y generará un error que causa una excepción de conflicto de actualización de instantánea en el código de llamada. Esto se debe a que la versión de los datos afectados por la transacción no es la misma al final de la transacción que al inicio.
Snapshot Read Committed no sufre este problema porque usa el bloqueo en escrituras (escrituras pesimistas) y obtiene información de la versión de instantánea de todos los datos confirmados en la estadística de cada declaración .
La posibilidad de conflictos de actualización de instantáneas en Snapshot y NOT Snapshot Read Committed es una diferencia extremadamente significativa entre los dos.
[! [Tabla de niveles de aislamiento] [2]] [2]
Vea el ejemplo a continuación:
Leer instantánea confirmada
Cambia la propiedad de la base de datos como abajo
ALTER DATABASE SQLAuthority
SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE
GO
Sesión 1
USE SQLAuthority
GO
BEGIN TRAN
UPDATE DemoTable
SET i = 4
WHERE i = 1
Sesión 2
USE SQLAuthority
GO
BEGIN TRAN
SELECT *
FROM DemoTable
WHERE i = 1
Resultado: la consulta en la sesión 2 muestra el valor anterior (1, ONE) porque la transacción actual NO está comprometida. Esta es la forma de evitar el bloqueo y leer datos comprometidos también.
Sesión 1
COMMIT
Sesión 2
USE SQLAuthority
GO
SELECT *
FROM DemoTable
WHERE i = 1
Resultado: la consulta en la sesión 2 no muestra filas porque la fila se actualiza en la sesión 1. Por lo tanto, estamos viendo datos confirmados.
Nivel de aislamiento de instantáneas
Este es el nuevo nivel de aislamiento, que estaba disponible desde SQL Server 2005 en adelante. Para esta función, se necesita un cambio en la aplicación ya que tiene que usar un nuevo nivel de aislamiento.
Cambia la configuración de la base de datos usando abajo. Necesitamos asegurarnos de que no haya ninguna transacción en la base de datos.
ALTER DATABASE SQLAuthority SET AllOW_SNAPSHOT_ISOLATION ON
Ahora, también tenemos que cambiar el nivel de aislamiento de la conexión usando debajo
Sesión 1
USE SQLAuthority
GO
BEGIN TRAN
UPDATE DemoTable
SET i = 10
WHERE i = 2
Sesión 2
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
GO
USE SQLAuthority
GO
BEGIN TRAN
SELECT *
FROM DemoTable
WHERE i = 2
Resultado: incluso si hemos cambiado el valor a 10, aún veremos el registro anterior en la sesión 2 (2, DOS).
Ahora, comprometamos la transacción en la sesión 1
Sesión 1
COMMIT
Regresemos a la sesión 2 y ejecutemos seleccionar de nuevo.
Sesión 2
SELECT *
FROM DemoTable
WHERE i = 2
Todavía veremos el registro porque la sesión 2 ha establecido la transacción con aislamiento de instantáneas. A menos que completemos la transacción, no veremos el último registro.
Sesión 2
COMMIT
SELECT *
FROM DemoTable
WHERE i = 2
Ahora, no deberíamos ver la fila, ya que está actualizada.
Ver: SQL Authority , Safari Books Online
READ COMMITTED SNAPSHOT
realiza lecturas optimistas y escrituras pesimistas. Por el contrario, SNAPSHOT
hace lecturas optimistas y escrituras optimistas.
Microsoft recomienda READ COMMITTED SNAPSHOT
para la mayoría de las aplicaciones que necesitan versiones de filas.
Lea este excelente artículo de Microsoft: Cómo elegir niveles de aislamiento basados en versiones de filas . Explica los beneficios y los costos de ambos niveles de aislamiento.
Y aquí hay uno más completo: http://msdn.microsoft.com/en-us/library/ms345124(SQL.90).aspx