2012-07-04 19 views
14

Estoy tratando de comprender el aislamiento/bloqueos en SQL Server.cuando/qué bloqueos se mantienen/liberan en el nivel de aislamiento READ COMMITTED

he siguiente escenario en lectura confirmada nivel de aislamiento (por defecto)

Tenemos una mesa.

create table Transactions(Tid int,amt int) 

with some records 

insert into Transactions values(1, 100) 
insert into Transactions values(2, -50) 
insert into Transactions values(3, 100) 
insert into Transactions values(4, -100) 
insert into Transactions values(5, 200) 

Ahora desde MSDN entendí

Cuando un selecto se dispara compartían bloqueo se toma de manera ninguna otra transacción puede modificar los datos (evitando lectura sucia) .. Documentación también habla de nivel de fila, a nivel de página , bloqueo de nivel de tabla. Pensé siguiente scenarion

Begin Transaction 

select * from Transactions 

/* 
some buisness logic which takes 5 minutes 

*/ 

Commit 

Lo que quiero entender es por lo que la duración del tiempo de bloqueo compartido sería adquirido, y que (fila, página, la tabla).

Will lock se adquirirá solo cuando se ejecute la instrucción select * from Transactions o se adquirirá durante más de 5 minutos hasta que lleguemos a COMMIT. cerradura

Respuesta

6

sólo se adquirirá cuando select * from Transaction se ejecuta

se puede comprobar con el código de abajo

abrir una sesión SQL y ejecutar esta consulta

Begin Transaction 

select * from Transactions 

WAITFOR DELAY '00:05' 
/* 
some buisness logic which takes 5 minutes 

*/ 

Commit 

abrir otra sesión de SQL y ejecutar a continuación consulta

Begin Transaction 
Update Transactions 
Set = ... 
where .... 
commit 
19

Usted está haciendo la pregunta incorrecta stion, le preocupa la implementación detalles. En lo que debes pensar y en lo que debes preocuparte es en la semántica del nivel de aislamiento. Kendra Little tiene un bonito cartel que los explica: Free Poster! Guide to SQL Server Isolation Levels.

Su pregunta debería reformularse como:

seleccionar * de artículos

Q: ¿Qué artículos veré?
A: Todos los artículos comprometidos

Q: ¿Qué pasa si hay transacciones sin confirmar que se han insertado/Artículos/actualización eliminados?
A: su SELECT se bloqueará hasta que todos los elementos no comprometidos se comprometan (o se retrotraigan).

Q: ¿Qué sucede si se insertan/eliminan nuevos elementos/actualizar mientras que Ejecuto la consulta de arriba?
A: Los resultados son indeterminados. Es posible que vea algunas de las modificaciones, no verá otro y posible bloqueo hasta que algunas de ellas se comprometan.

LEA COMPROMETIDO no hace ninguna promesa una vez que su declaración finalizó, sin importar la duración de la transacción. Si vuelve a ejecutar el enunciado volverá a tener exactamente la misma semántica que el estado anterior, y los Elementos que ha visto antes pueden cambiar, desaparecer y puede aparecer uno nuevo.Obviamente, esto implica que los cambios pueden hacerse a los artículos después de su selección.

Los niveles de aislamiento más altos ofrecen garantías más sólidas: REPEATABLE READ garantiza que ningún elemento que haya seleccionado la primera vez se puede modificar o eliminar hasta su confirmación. SERIALIZABLE agrega la garantía de que ningún elemento nuevo puede aparecer en su segunda selección antes de comprometerse.

Esto es lo que necesita comprender, no cómo funciona el mecanismo de implementación. Después de dominar estos conceptos, puede preguntar los detalles de implementación. Todos están descritos en Transaction Processing: Concepts and Techniques.

+0

detalles de implementación son importantes cuando obtiene bloqueos de tabla en lugar de bloqueos de fila. – matao

+0

El pequeño enlace de Kendra está roto – TinyTheBrontosaurus

6

Su pregunta es buena. Comprender qué tipo de cerraduras se adquieren permite una comprensión profunda de DBMS. En SQL Server, bajo todos los niveles de aislamiento (lectura no confirmada, lectura confirmada (predeterminada), lecturas repetibles, serializables) Se adquieren bloqueos exclusivos para las operaciones de escritura.

Los bloqueos exclusivos se liberan cuando finaliza la transacción, independientemente del nivel de aislamiento.

La diferencia entre los niveles de aislamiento se refiere a la forma en que se adquieren/liberan los bloqueos compartidos (leídos).

Bajo lectura Nivel de aislamiento no confirmado, no se adquieren bloqueos compartidos. Bajo este nivel de aislamiento, puede producirse el problema de concurrencia conocido como "lecturas sucias" (una transacción puede leer datos de una fila que ha sido modificada por otra transacción en ejecución y aún no se ha confirmado, por lo que podría retrotraerse).

Bajo nivel de aislamiento comprometido, se adquieren bloqueos compartidos para los registros en cuestión. Los bloqueos compartidos se liberan cuando finaliza la instrucción actual. Este nivel de aislamiento impide "lecturas sucias" pero, dado que el registro puede actualizarse mediante otras transacciones simultáneas, "lecturas no repetibles" (la transacción A recupera una fila, la transacción B posteriormente actualiza la fila y la transacción A recupera posteriormente la misma fila nuevamente .La transacción A recupera la misma fila dos veces pero ve datos diferentes) o "Phantom Reads" (en el curso de una transacción, se ejecutan dos consultas idénticas, y la colección de filas devuelta por la segunda consulta es diferente de la primera) puede ocurrir .

Bajo el nivel de aislamiento de Read Repeatable, los bloqueos compartidos se adquieren por la duración de la transacción. Se evitan las "lecturas sucias" y las "lecturas no repetibles", pero aún puede haber "lecturas fantasmas".

Bajo Nivel de aislamiento serializable, los bloqueos compartidos a distancia se adquieren por la duración de la transacción. No se produce ninguno de los problemas de concurrencia mencionados anteriormente, pero el rendimiento se reduce drásticamente y existe el riesgo de que se produzca un bloqueo.

Cuestiones relacionadas