sql >> Database >  >> RDS >> Oracle

Is een impasse mogelijk bij het bijwerken en verwijderen van verschillende rijen in een tabel?

Als u uw vraag zou kunnen bijwerken met de deadlock-grafiek, zou dat nuttige informatie zijn. (Wanneer uw toepassing een deadlock tegenkomt, zal Oracle een ORA-00060 verhogen en een tracefile wordt geschreven naar de user_dump_dest.) Als u in het traceringsbestand kijkt, vindt u een sectie met de naam "Deadlock Graph". Als je dat kunt posten, en ook de verklaring kunt posten die de impasse veroorzaakte en andere verklaringen die bij de impasse betrokken waren, dan kunnen we beginnen met het trekken van enkele conclusies. (Alle informatie die ik heb gevraagd is beschikbaar in het traceerbestand.)

Zoals Alessandro al zei, is het mogelijk dat sessies die verschillende rijen in dezelfde tabel vergrendelen, vastlopen vanwege niet-geïndexeerde externe sleutels in de onderliggende tabel van een bovenliggende/onderliggende relatie. Het is ook mogelijk dat er tijdens twee sessies deadlocks optreden bij het bijwerken van verschillende rijen van dezelfde tabel, zelfs als de tabel geen deel uitmaakt van een bovenliggende/onderliggende relatie, bijvoorbeeld als de tabel een tekort aan ITL-vermeldingen heeft.

Plaats nogmaals de hierboven gevraagde informatie en ik ben ervan overtuigd dat we de oorzaak van uw impasse kunnen achterhalen.

Toegevoegd op 30-7-2012 **

Het volgende toevoegen, nu het deadlock-traceerbestand is geleverd:Ok, ten eerste, op basis van de inhoud van het trace-bestand is dit een eenvoudige deadlock omdat sessies elkaar overlappen/botsen op de rijen die ze proberen te vergrendelen. Ondanks je eerdere opmerkingen over de impasse op anders rijen, ik ben hier om u te vertellen dat deze specifieke impasse te wijten is aan vergrendeling op rijniveau op dezelfde rijen.

Het feit dat de deadlock-grafiek de modus laat zien waarin het slot wordt vastgehouden, is 'X' (exclusief) en de modus waarop het slot wordt gewacht is 'X', wat me zegt dat dit een eenvoudige vergrendeling op rijniveau is.

In dit geval voert SID 20 "verwijderen uit RPT_TABLE.TEMP_TABLE_T1 waar TEMP_T1_ID=:1" uit en al een slot op rowid AAAPDIAAMAAAEfIAAA.

Ondertussen voert SID 790 "RPT_TABLE.T1_UPDATE_StoredProc" uit, terwijl hij al een lock op rowid AAAPDIAAMAAAEfGAAA vasthoudt.

Merk op uit het gedeelte "Rijen gewacht op" van het traceerbestand, dat SID 20 wacht op de rij die SID 790 vasthoudt en SID 790 wacht op de rij die SID 20 vasthoudt. Dit is een klassieke impasse.

Wat aanvullende informatie:

  • Type wachtrij is TX (zie de deadlock-grafiek), dus dit is zeker niet vergrendeling door niet-geïndexeerde externe sleutels. Als het vergrendeld zou zijn vanwege niet-geïndexeerde FK's, zou het wachtrijtype TM zijn, niet TX. (Er is minstens één ander geval waarbij TM-wachtrijen betrokken zijn, en het zijn geen niet-geïndexeerde FK's. Ga er dus niet vanuit dat TM-wachtrijen altijd niet-geïndexeerde FK's betekenen.)

  • De modus waarop het slot wordt gewacht is 'X' (exclusief), dus dit is vergrendeling op rijniveau. Als de modus waarop wachtte 'S' was (gedeeld), dan zou het niet vergrendeling op rijniveau zijn. Het kan eerder een ITL-tekort of PK- of VK-handhaving zijn.

Ik hoop dat dat helpt!



  1. Waarom niet null primaire sleutel gebruiken in TSQL?

  2. Hoe automatisch migraties genereren met Sequelize CLI vanuit Sequelize-modellen?

  3. Neo4j - Gegevens selecteren met MATCH met Cypher

  4. Time-out voor SQL Server-query, afhankelijk van Where-clausule