Estoy buscando una buena estrategia para hacer frente a interbloqueos de bases de datos desde una aplicación Java 6; varios hilos paralelos podrían, potencialmente, escribir en la misma tabla al mismo tiempo. La base de datos (Ingres RDMBS) matará aleatoriamente una de las sesiones si detecta un interbloqueo.Multithreading: evitar y ocuparse de los interbloqueos de la base de datos
¿Cuál sería una técnica aceptable para hacer frente a la situación de estancamiento, dados los siguientes requisitos?
- el tiempo total transcurrido debe mantenerse tan pequeño como sea razonablemente posible
- matando a una sesión incurrirá en un significativa (medible) deshacer
- hilos de tiempo no tienen manera de
comunicarse entre sí, es decir la estrategia debe ser autónomo
hasta ahora, la estrategia que se me ocurrió es algo a lo largo de estas líneas:
short attempts = 0;
boolean success = false;
long delayMs = 0;
Random random = new Random();
do {
try {
//insert loads of records in table 'x'
success = true;
} catch (ConcurrencyFailureException e) {
attempts++;
success = false;
delayMs = 1000*attempts+random.nextInt(1000*attempts);
try {
Thread.sleep(delayMs);
} catch (InterruptedException ie) {
}
}
} while (!success);
¿Se puede mejorar de alguna manera? p.ej. esperando una cantidad fija (número mágico) de segundos. ¿Existe una estrategia diferente que produzca mejores resultados?
Nota: Se usarán varias técnicas de nivel de base de datos para garantizar que los interbloqueos sean, en la práctica, muy raros. Además, la aplicación intentará evitar la programación de hilos que escriben en la misma tabla al mismo tiempo. La situación anterior será solo un "peor de los casos".
Nota: La tabla en la que se insertan los registros está organizada como una tabla dividida en heap y no tiene índices; cada hilo insertará registros en su propia partición.
La función exponencial suena bien - ¡Intentaré simularla! Como mencioné en la nota, el diseño de la aplicación tendrá como objetivo evitar interbloqueos, incluida la organización favorable del acceso a la base de datos. Pero no hay garantía de que, en casos de esquina, se produzca un gran número de interbloqueos. – Adrian
¿Puede proporcionar alguna referencia técnica para la técnica de "retroceso exponencial" que menciona? – Adrian
Se usa comúnmente en protocolos de red para evitar la congestión. Consulte el artículo de la wiki: http://en.wikipedia.org/wiki/Exponential_backoff Pero la idea básica es simple. Simplemente usa algún tipo de función exponencial para determinar la demora en cada intento de reintento. Los detalles exactos se pueden modificar para que se ajusten a sus propósitos. Por supuesto, la implementación más simple posible sería retrasar por 2^n ms donde n es el número de intentos hasta ahora.Pero tal vez pienses que, para empezar, crece demasiado lento o comienza demasiado bajo o crece demasiado rápido. Luego, simplemente agrega un multiplicador o agrega algo a n – jalf