¿Cuál es la mejor manera de administrar contenciones de lectura / escritura en bloques de bases de datos?

¡Cuidado! Escribí cosas en tiempo real que dependían de las cerraduras, pero se cayeron de la curva de potencia y se retiraron. Pero aquí va.

Los errores que más te preocupan están en el diseño mismo. Algunos elementos de supervisión del motor de base de datos en el diseño / implementación tienen que priorizar la secuencia de bloqueos. Cuando esto no sucede, el caso clásico es una función que primero bloquea una A y luego bloquea una B; pero prácticamente en el mismo nanosegundo, otro núcleo de la CPU está ejecutando una función diferente que bloquea esa misma B y luego va por una A, que eventualmente será LA MISMA A, y se estancan. Sin respuesta. Proceso muerto.

Los puntos más finos, por ejemplo, bloquear todos los A y luego todos los B en lugar de solo uno de cada uno, pueden valer la pena. Esto hace que sea mucho más simple localizar áreas de código que aplican bloqueos fuera de secuencia, y mucho más fácil encontrarlas durante la depuración porque no hay necesidad de esperar el caso de bloqueo de las dos A y B, pero no en la secuencia correcta, y durante una ventana de tiempo muy estrecha. Esos son difíciles de encontrar.

Aquí no se discute cómo la escala de bloqueo afecta el diseño, simplemente una nota de que uno hace una gran compensación de rendimiento en bases de datos complejas a las que acceden decenas de miles de hilos en un solo momento, como en Do Not Ever Go There. Un pequeño sistema de archivos con unas pocas decenas de miles de archivos y una sola unidad de disco sufre pocos efectos negativos. Pero una base de datos con muchos usuarios simultáneos no puede darse el lujo de ser tan infantilmente simple.

Un término genérico para un esquema de bloqueo es “sincronización”. Piense en un guardia de cruce escolar caminando hacia el tráfico con su letrero yendo hacia adelante para que el tráfico se detenga; entonces los niños cruzan la calle. Esto sincroniza el flujo de niños frente a automóviles. A nivel de hardware, la sincronización de los accesos de lectura y escritura ya se ha manejado, por supuesto, o nada de esto podría funcionar.

Cuando una base de datos se distribuye en varios cuadros, no puede haber tal sincronización de palabras de memoria; la dificultad de sincronizar las actualizaciones de la base de datos en múltiples plataformas conectadas solo por ejemplo, ethernet es un campo en sí mismo; supongamos que el problema ha sido manejado por los gurús en el siguiente pasillo.

El requisito básico al configurar una jerarquía de sincronización o bloqueo es establecer un orden específico para aplicar bloqueos, y luego escribirlo en una “biblia de diseño” y verificarlo cada vez que se agrega o cambia el código.

También debemos distinguir entre leer una A o B y cambiarla. Si el código que lee es viable hasta que lo que lee se bloquea y cambia de repente justo después de que se haya eliminado el valor anterior, está bien, pero este no suele ser el caso. Sin embargo, un bloqueo de lectura nunca debería bloquear a otros lectores. Cuando el último lector desbloquea se puede otorgar un bloqueo de escritura; bloquea tanto las lecturas como las escrituras hasta que se libera, por lo que no hay un “recuento de escritores” de la forma en que se necesita un “recuento de lectores activos” para reflejar el número de bloqueos de lectura que se mantienen actualmente.

Y, por supuesto, debe haber un bloqueo de escritura en el recuento de lectores activos que tiene prioridad sobre todo lo demás. La buena noticia es que se mantendrá durante un período de tiempo muy, muy corto, pero al llegar a cero deberá mantenerse hasta que permita que continúe cualquier solicitud de bloqueo de escritura pendiente. Cuidado con el comprador: nada de esto es tan simple como puede parecer.

Debido a que las bases de datos son sutilmente complejas, establecer una secuencia de bloqueo de A y B, etc. puede volverse casi imposible; Algunos casos específicos casi siempre salen a la luz donde algunos B deben ser absolutamente estabilizados (bloqueados) antes de que se pueda discernir el A correcto.

La creatividad puede encontrar una solución, por ejemplo, un bloqueo de situación de emergencia que tenga su propia página en la biblia de diseño y pueda bloquear la lectura de todas las A mientras que el proceso de pato impar mira su B y encuentra qué A quiere, con una advertencia de que solo el la mayoría del personal superior podrá tocarlo. Por lo tanto, proponga una forma de Leer-bloquear todas las A y luego Leer-bloquear la B individual, Leer-bloquear la A elegida y liberar las Todas las A. Pero el bloqueo de lectura de todas las A puede ser extremadamente costoso. Obtienes lo que pagas, si puedes pagar la factura. Los gurús en el siguiente pasillo a menudo están trabajando duro para reducir ese costo.