Je suggérerais de mettre en file d'attente toutes les actions SQL de plusieurs threads dans une structure de données intermédiaire, puis de les mettre dans la base de données à partir d'un seul thread. Il est possible d'avoir les structures intermédiaires thread safe comme ConcurrentHashMap
, ConcurrentLinkedQueue
ou vous pouvez simplement synchroniser lorsque vous travaillez avec.
De cette façon, vous n'avez même pas besoin de commencer la transaction à l'avance. Les données en attente peuvent être moins sûres, mais je suppose qu'elles ne sont pas beaucoup plus sûres dans la base de données tant que la transaction n'est pas encore validée.
Bien sûr, cela ne peut fonctionner que si vous n'avez pas select
instructions sélectionnant des données de transaction non validées à partir de la même transaction. Se débarrasser de ces requêtes d'une manière ou d'une autre peut nécessiter une refonte.
Utilisez CountDownLatch
pour détecter quand toutes les données sont prêtes et que le thread d'écriture de la base de données doit commencer son action. Si cela ne se produit jamais, utilisez le modèle de réacteur pour le fil d'écriture de la base de données.