2010-10-08 12 views
5

He intentado reproducir la situación de la pregunta [1].Comprender el comportamiento de bloqueo en SQL Server

En la tabla, tomada y lleno de datos de la wiki "(sistemas de bases de datos) de aislamiento" [2],
en SQL Server 2008 R2 SSMS, ejecuté:

1) por primera vez en la primera pestaña (ventana) de SSMS

-- transaction isolation level in first window does not influence results (?) 
-- initially I thought that second transaction in 2) runs at the level set in first window 

begin transaction 
INSERT INTO users VALUES (3, 'Bob', 27) 
waitfor delay '00:00:22' 
rollback 

2) inmediatamente después, en segunda ventana

-- this is what I commented/uncommented 

-- set transaction isolation level SERIALIZABLE 
-- set transaction isolation level READ REPEATABLE 
-- set transaction isolation level READ COMMITTED 
-- set transaction isolation level READ UNCOMMITTED 

SELECT * FROM users --WITH(NOLOCK) 

Actualización:
Lo sentimos, los resultados fueron corregidos.

Mis resultados, dependiendo del nivel de aislamiento establecido en 2), son que SELECT devuelve:

  • inmediatamente (lectura fila insertada no comprometidos)

    • para todos los casos de SELECT con NOLOCK
    • para READ UNCOMMITTED (SELECCIONAR con o sin NOLOCK)
  • está a la espera de la finalización de la transacción 1) (SOLAMENTE SI SELECT es sin NOLOCK) y

    • en LEER comprometido y superior (repetible READ, SERIALIZABLE) transacción nivel de aislamiento

Estos los resultados contradicen la situación descrita en la pregunta (¿y se explica en las respuestas?) [1]
(por ejemplo, que SELECCIONAR con NOCHECK está esperando la finalización de 1)), etc.

¿Cómo se pueden explicar mis resultados y [1]?


Update2:
Esta pregunta es realmente de preguntas adicionales de mis preguntas [3] (o el resultado de ellos no se responde).

citados:
[1]
explicar el comportamiento de bloqueo en SQL Server
Explain locking behavior in SQL Server
[2]
"aislamiento (sistemas de base de datos)"
Plz Añadir barra) para vincular. ¡No logro conservarlo aquí en el enlace! http://en.wikipedia.org/wiki/Isolation_(database_systems)
[3]
¿NOLOCK es el valor predeterminado para las sentencias SELECT en SQL Server 2005?
Is NOLOCK the default for SELECT statements in SQL Server 2005?

+0

El nivel de aislamiento para la transacción de inserción no afectará en absoluto a lo que ve la segunda transacción. ¿Estás seguro de que tu segunda transacción no se estaba ejecutando con el nivel "LEER SIN COMPROMISO"? –

Respuesta

2

Hay una utilidad MSDN vincularla charla acerca de las sugerencias en SQL 2008. Tal bloqueo en su ejemplo es un caso de SQL Server 2008 disfavoring sus cerraduras mesas?

(El siguiente fragmento desde el siguiente enlace habla de cerraduras potencialmente siendo ingored por SQL Server 2008)

Como se muestra en el siguiente ejemplo, si el nivel de aislamiento se establece en SERIALIZABLE, y el nivel de tabla de bloqueo pista NOLOCK se utiliza con la instrucción SELECT, los bloqueos de rango de clave utilizados normalmente para mantener transacciones serializables no se toman.

CopyUSE AdventureWorks2008R2; 
GO 
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 
GO 
BEGIN TRANSACTION; 
GO 
SELECT Title 
    FROM HumanResources.Employee WITH (NOLOCK); 
GO 

-- Get information about the locks held by 
-- the transaction. 
SELECT 
     resource_type, 
     resource_subtype, 
     request_mode 
    FROM sys.dm_tran_locks 
    WHERE request_session_id = @@spid; 

-- End the transaction. 
ROLLBACK; 
GO 

La única cerradura tomada que las referencias HumanResources.Employee es una estabilidad esquema (SCH-S) bloquear. En este caso, serializability ya no se garantiza.

En SQL Server 2008, la opción LOCK_ESCALATION de A LTER TABLE puede desaprobar la tabla bloquea y habilita bloqueos HoBT en tablas particionadas. Esta opción no es una sugerencia de bloqueo, pero puede utilizarse para reducir la escalada de bloqueo. Para obtener más información, consulte ALTER TABLE (Transact-SQL).

+0

Esto solo sería relevante si la transacción original estaba haciendo un 'SELECCIONAR' –

+0

@Martin - gracias, no estaba seguro de mí mismo, pero todavía sentía que valía la pena publicarlo. – kevchadders

+0

gracias! Me ahogaron en las discusiones contradictorias en esta área, encontré solo referencias para el bloqueo descr en otros RDBMS (Oracle, PostGreSQL, etc.). Ahora con la frase clave "(Sch-S) lock" Estoy en el camino correcto en las búsquedas. WTF, las mismas cerraduras se llaman de manera diferente en diferentes DBMS que describen los mismos conceptos ... –

1

La sugerencia en la segunda consulta anula nivel de aislamiento.
SELECT ... WITH (NOLOCK) es básicamente idéntico a SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; SELECT ....

Con cualquier otro nivel de aislamiento de las cerraduras son honrados, por lo que la segunda transacción espera hasta que los bloqueos se liberan por la primera.

Cuestiones relacionadas