Бих предложил да поставите на опашка всички SQL действия от множество нишки в някаква междинна структура от данни и след това да ги поставите в база данни от една нишка. Възможно е да имате нишки безопасни междинни структури като ConcurrentHashMap
, ConcurrentLinkedQueue
или можете просто да синхронизирате, когато работите с него.
По този начин дори не е необходимо да стартирате транзакцията предварително. Изчакващите данни може да са по-малко безопасни, но предполагам, че не са много по-безопасни в базата данни, докато транзакцията все още не е ангажирана.
Разбира се, това може да работи само ако нямате select
изявления, избиращи данни за незаети транзакции от същата транзакция. Да се отървете от такива заявки по един или друг начин може да изисква преработка.
Използвайте CountDownLatch
за да открие кога всички данни са готови и нишката за писане на база данни трябва да започне своето действие. Ако това никога не се случи, използвайте модел на реактор за нишката за писане на база данни.