Jag skulle föreslå att köa alla SQL-åtgärder från flera trådar i någon mellanliggande datastruktur och sedan lägga in i databasen från en enda tråd. Det är möjligt att ha trådsäkra mellanstrukturer som ConcurrentHashMap
, ConcurrentLinkedQueue
eller så kan du bara synkronisera när du arbetar med det.
På så sätt behöver du inte ens starta transaktionen i förväg. De väntande uppgifterna kan vara mindre säkra, men jag antar att de inte är mycket säkrare i databasen medan transaktionen inte är genomförd ännu.
Naturligtvis kan detta bara fungera om du inte har select
uttalanden som plockar oengagerad transaktionsdata från samma transaktion. Att bli av med sådana frågor på ett eller annat sätt kan kräva omdesign.
Använd CountDownLatch
för att upptäcka när all data är klar och databasskrivtråden bör starta sin åtgärd. Om det aldrig händer, använd reaktormönster för databasskrivtråden.