sql >> Database >  >> RDS >> Oracle

Oracle rij-conflict veroorzaakt deadlock-fouten in JMS-toepassing met hoge doorvoer

Een impasse houdt in dat elke thread meerdere rijen in één transactie probeert bij te werken en dat die updates in een andere volgorde worden uitgevoerd. Het eenvoudigst mogelijke antwoord zou daarom zijn om de code aan te passen zodat berichten binnen dezelfde transactie in een bepaalde volgorde worden toegepast (d.w.z. in volgorde van de primaire sleutel). Dat zou ervoor zorgen dat je nooit een deadlock zou krijgen, hoewel je nog steeds blokkerende locks zou krijgen terwijl de ene thread wacht op een andere thread om zijn transactie door te voeren.

Als u echter een stap terug doet, lijkt het onwaarschijnlijk dat u echt wilt dat veel threads dezelfde rij in een tabel bijwerken als u de volgorde van de updates niet kunt voorspellen. Het lijkt zeer waarschijnlijk dat dit zou leiden tot veel verloren updates en nogal onvoorspelbaar gedrag. Wat doet uw toepassing precies dat dit soort dingen verstandig zou maken? Doe je zoiets als het bijwerken van aggregatietabellen na het invoegen van rijen in een detailtabel (d.w.z. het bijwerken van het aantal weergaven dat een bericht heeft, naast het loggen van informatie over een bepaalde weergave)? Zo ja, moeten die bewerkingen dan echt synchroon verlopen? Of zou je het aantal weergaven periodiek in een andere thread kunnen bijwerken door de weergaven van de afgelopen N seconde bij elkaar op te tellen?



  1. hoe duplicaten in mysql te verwijderen met case

  2. MySql JDBC-time-out, zelfs met 'autoReconnect=true'

  3. MySQL-opdracht om in CSV (of vergelijkbare array) te zoeken

  4. GROUP BY na ORDER BY