Un poco común de la lógica de programación me encuentro a menudo la implementación es algo como el siguiente pseudo-código:Sincronización de base de datos Access en una Distributed App
Let X = some value
Let Database = some external Database handle
if !Database.contains(X):
SomeCalculation()
Database.insert(X)
Sin embargo, en un programa multi-hilo que tiene una condición de carrera aquí. El hilo A podría verificar si X
está en Database
, encuentra que no es así, y luego procede a llamar al SomeCalculation()
. Mientras tanto, el hilo B también verificará si X
está en Database
, encuentra que no es así, e inserta una entrada duplicada.
Así que, por supuesto, esto debe ser sincronizado como:
Let X = some value
Let Database = some external Database handle
LockMutex()
if !Database.contains(X):
SomeCalculation()
Database.insert(X)
UnlockMutex()
Esto está bien, excepto lo que si la aplicación es una aplicación distribuida, se ejecuta en varios equipos, todos los cuales se comunican con la misma fuente Back máquina de base de datos final? En este caso, un Mutex es inútil, ya que solo sincroniza una sola instancia de la aplicación con otros subprocesos locales. Para que esto funcione, necesitaríamos algún tipo de técnica de sincronización distribuida "global". (Suponga que simplemente no permitir duplicados en Database
no es una estrategia factible.)
En general, ¿cuáles son algunas soluciones prácticas para este problema?
que dan cuenta de esta pregunta es muy genérica , pero no quiero hacer de esto una cuestión específica del idioma ya que este es un problema que surge a través de múltiples idiomas y múltiples tecnologías de bases de datos.
evitaba intencionalmente especificar si estoy hablando de un RDBMS o base de datos SQL, frente a algo así como una base de datos NoSQL, porque una vez más - Busco respuestas generalizadas en base a prácticas de la industria. Por ejemplo, ¿es esta situación algo que los Procedimientos almacenados atómicos podrían resolver? ¿O transacciones atómicas? ¿O es algo que requiere algo así como un "Mutex distribuido"? O, de manera más general, ¿este problema generalmente es abordado por el sistema de la base de datos, o es algo que la aplicación en sí debería manejar?
Si resulta que esta pregunta es imposible para responder en absoluto sin más información, dígame para que pueda modificarla.