Saya akan menyarankan untuk mengantri semua tindakan SQL dari beberapa utas di beberapa struktur data perantara, dan kemudian dimasukkan ke dalam database dari satu utas. Dimungkinkan untuk memiliki struktur perantara yang aman untuk utas seperti ConcurrentHashMap
, ConcurrentLinkedQueue
atau Anda dapat menyinkronkannya saat bekerja dengannya.
Dengan cara ini Anda bahkan tidak perlu memulai transaksi terlebih dahulu. Data yang tertunda mungkin kurang aman, tetapi saya berasumsi bahwa data tersebut tidak jauh lebih aman di database saat transaksi belum dilakukan.
Tentu saja, ini hanya dapat berfungsi jika Anda tidak memiliki select
pernyataan memilih data transaksi yang tidak terikat dari transaksi yang sama. Menyingkirkan kueri semacam itu dengan satu atau lain cara mungkin memerlukan desain ulang.
Gunakan CountDownLatch
untuk mendeteksi ketika semua data sudah siap dan utas penulisan basis data harus memulai tindakannya. Jika tidak pernah terjadi, gunakan pola reaktor untuk utas penulisan basis data.