Mysql
 sql >> Datenbank >  >> RDS >> Mysql

mySQL - Tabellensperrung vs. Zeilensperrung

Wenn Sie einen Index für tblAreas.AreaID haben, dann jede Transaktion, die WHERE tblAreas.AreaID in (...) enthält sperrt den Index für diese Einträge. Dabei spielt es keine Rolle, ob die Zeilen selbst vorhanden sind oder nicht. Diese Sperre verhindert, dass eine andere Transaktion Einträge für diese IDs einfügt. Also denke ich nicht, dass du einen deiner Vorschläge machen musst. Wenn Sie einfach abfragen, ob alle Gebiete für Ihr Gebiet verfügbar sind, erhalten Sie die Sperren, die Sie benötigen, um Ihr Gebiet atomar einzufügen.

Dies könnte ein kleines Problem sein, da Ihre Bereichs-IDs nicht spielweit eindeutig sind, sodass es zu einer falschen Serialisierung zwischen Bereichen mit derselben ID auf verschiedenen Karten kommen kann. Es kann hilfreich sein, mapID zu Ihrer tblAreas-Tabelle hinzuzufügen, damit Sie stattdessen einen (mapID, areaID)-Index zum Nachschlagen erstellen können, wodurch falsche Kollisionen im Index vermieden werden. (Das würde Ihr Schema denormalisieren, was Sie vielleicht aus anderen Gründen nicht möchten.)