sql >> Database >  >> RDS >> Mysql

MySQL - Tabelrijen bijwerken zonder de rijen te vergrendelen

Allereerst, als u standaard de InnoDB-opslagengine van MySQL gebruikt, kunt u gegevens op geen enkele manier bijwerken zonder rijvergrendelingen, behalve door het transactie-isolatieniveau in te stellen op LEZEN UNCOMMITTED door uit te voeren

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

Ik denk echter niet dat het databasegedrag is wat u verwacht, aangezien de vuile lezing in dit geval is toegestaan. LEES ONBETROKKEN is in de praktijk zelden nuttig.

Om het antwoord van @Tim aan te vullen, is het inderdaad een goed idee om een ​​unieke index te hebben op de kolom die wordt gebruikt in de waar-clausule. Houd er echter ook rekening mee dat er geen absolute garantie is dat de optimizer uiteindelijk een dergelijk uitvoeringsplan zal kiezen met behulp van de gecreëerde index. Het kan werken of niet werken, afhankelijk van het geval.

Wat u in uw geval zou kunnen doen, is de lange transactie opsplitsen in meerdere korte transacties. In plaats van miljoenen rijen in één keer bij te werken, zou het beter zijn om elke keer slechts duizenden rijen te scannen. De X-locks worden vrijgegeven wanneer elke korte transactie wordt vastgelegd of teruggedraaid, waardoor de gelijktijdige updates de kans krijgen om door te gaan.

Overigens neem ik aan dat uw batch een lagere prioriteit heeft dan de andere online processen, dus het kan buiten de piekuren worden gepland om de impact verder te minimaliseren.

PS Het IX-slot bevindt zich niet op het record zelf, maar is gekoppeld aan het tabelobject met een hogere granulariteit. En zelfs met het REPEATABLE READ transactie-isolatieniveau is er geen gap lock wanneer de query een unieke index gebruikt.



  1. De hash-waarde van een rij vinden in postgresql

  2. GROUP BY-clausule begrijpen

  3. Hibernate-relatietoewijzing/Batch-inserts versnellen

  4. hoe de door komma's gescheiden waarde van de database toe te voegen, te bewerken en te verwijderen.?