2012-08-29 6 views
12

así, introducir el tema de aislamiento en Wikipedia tienen esas palabras, enlaces es here¿Qué son los bloqueos de rango?

......... Serializable Este es el más alto nivel de aislamiento. Con una implementación de DBMS de control de concurrencia basada en bloqueo, la serializabilidad requiere bloqueos de lectura y escritura (adquiridos en datos seleccionados) para ser liberados al final de la transacción. También se deben adquirir los bloqueos de rango cuando una consulta SELECT utiliza una cláusula WHERE a distancia, especialmente para evitar el fenómeno de lecturas fantasmas (consulte a continuación). Al usar control de simultaneidad sin bloqueo, no se adquieren bloqueos; sin embargo, si el sistema detecta una colisión de escritura entre varias transacciones simultáneas, solo una de ellas puede comprometerse. Consulte el aislamiento de instantáneas para obtener más detalles sobre este tema.

pero todo el tema no explicaba "range-locks", google alse no tiene una descripción precisa.

¿Qué es "bloqueos de rango", y cuál es diferente con "bloqueo de lectura" y "bloqueo de escritura"?

gracias!

Respuesta

8

Si usa un rango en la cláusula WHERE, la base de datos bloqueará cada posible tupla en este rango y también la siguiente tupla (antes y después). Si no hay una próxima tupla disponible en una dirección, se bloqueará completamente en esta dirección.

Por lo tanto, el SELECT es confiable dentro de la transacción.

+2

Esto no es solo para 'BETWEEN'. Siempre que la selección no sea para una única fila única, puede obtener bloqueos de rango. 'SELECT * FROM Users WHERE LastName = 'Adams'' es un rango, ya que puede devolver más de una fila, y no hay una cláusula BETWEEN. –

+1

Vale la pena señalar que un bloqueo de rango también bloquea el rango entre dos tuplas, no solo las tuplas mismas. – usr

+0

¿Qué es una "tupla" en este contexto? – d512

9

La manera más fácil de usar el bloqueo (no todas las bases de datos utilizan el bloqueo en absoluto) para evitar que las operaciones concurrentes colisionen, es bloquear una base de datos completa. Esto haría todo uno por uno, lo que sería terriblemente lento.

El siguiente paso, es si bloquea toda una tabla. Al menos otras tablas no se ralentizan.

Más estrecho es para bloquear una fila. Puede actualizar esa fila de forma segura y no bloquear otras operaciones.

Hay un bloqueo de rango entre los dos últimos. Los casos donde se usa incluyen:

  1. La consulta afecta a un rango de valores.
  2. Un índice no exclusivo se ve afectado por la consulta (porque puede haber más de una fila que coincida, por ejemplo, 23, por lo que 23 identifica un rango en lugar de una fila).
  3. Insertar una nueva clave autoincrementada (bloquear el intervalo entre max(curvalue) + indexincrement y ).