Sugeriría poner en cola todas las acciones de SQL de varios subprocesos en alguna estructura de datos intermedia y luego colocarlas en la base de datos desde un solo subproceso. Es posible tener estructuras intermedias seguras para subprocesos como ConcurrentHashMap
, ConcurrentLinkedQueue
o puede simplemente sincronizar cuando trabaje con él.
De esta manera, ni siquiera necesita iniciar la transacción por adelantado. Los datos pendientes pueden ser menos seguros, pero asumo que no son mucho más seguros en la base de datos mientras la transacción aún no se haya confirmado.
Por supuesto, esto solo puede funcionar si no tiene select
declaraciones que seleccionan datos de transacciones no confirmadas de la misma transacción. Deshacerse de tales consultas de una forma u otra puede requerir un rediseño.
Usar CountDownLatch
para detectar cuándo todos los datos están listos y el subproceso de escritura de la base de datos debe comenzar su acción. Si nunca sucede, use el patrón reactor para el subproceso de escritura de la base de datos.