sql >> Databasteknik >  >> RDS >> Mysql

MySQL - Uppdatera tabellrader utan att låsa raderna

Först och främst, om du som standard använder InnoDB-lagringsmotorn för MySQL, så finns det inget sätt att uppdatera data utan radlås förutom att ställa ner transaktionsisoleringsnivån till LÄS UNDERFÖRANDE genom att köra

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;

Jag tror dock inte att databasbeteendet är vad du förväntar dig eftersom den smutsiga läsningen är tillåten i det här fallet. LÄS OENGAGERAD är sällan användbart i praktiken.

För att komplettera svaret från @Tim är det verkligen en bra idé att ha ett unikt index på kolumnen som används i where-satsen. Observera dock också att det inte finns någon absolut garanti för att optimeraren så småningom kommer att välja en sådan exekveringsplan med hjälp av det skapade indexet. Det kan fungera eller inte fungera, beroende på fallet.

För ditt fall, vad du kan göra är att dela upp den långa transaktionen i flera korta transaktioner. Istället för att uppdatera miljontals rader på en gång skulle det vara bättre att skanna bara tusentals rader varje gång. X-låsen släpps när varje kort transaktion genomförs eller återställs, vilket ger de samtidiga uppdateringarna möjlighet att gå vidare.

Förresten, jag antar att din batch har lägre prioritet än de andra onlineprocesserna, så den kan schemaläggas utanför rusningstid för att ytterligare minimera effekten.

P.S. IX-låset finns inte på själva posten, utan kopplat till tabellobjektet med högre granularitet. Och även med transaktionsisoleringsnivån REPEATABLE READ finns det inget gaplås när frågan använder ett unikt index.



  1. MySQL:Kolumn automatiskt aktuell tid för insättning

  2. Oracle AQ köbeställning

  3. CONVERT() i SQL Server

  4. mysql cirkulärt beroende i främmande nyckelbegränsningar