Navrhoval bych zařadit všechny akce SQL z více vláken do nějaké mezilehlé datové struktury a poté je vložit do databáze z jednoho vlákna. Je možné mít pro vlákna bezpečné mezilehlé struktury jako ConcurrentHashMap , ConcurrentLinkedQueue nebo se můžete při práci s ním jen synchronizovat.
Tímto způsobem dokonce nemusíte zahájit transakci předem. Nevyřízená data mohou být méně bezpečná, ale předpokládám, že v databázi nejsou o mnoho bezpečnější, dokud transakce ještě není potvrzena.
To samozřejmě může fungovat pouze v případě, že nemáte select výpisy vybírající data o nepotvrzené transakci ze stejné transakce. Zbavit se takových dotazů tak či onak může vyžadovat přepracování.
Použijte CountDownLatch zjistit, kdy jsou všechna data připravena a vlákno zápisu databáze by mělo zahájit svou akci. Pokud se tak nestane, použijte pro vlákno zápisu databáze vzor reaktoru.