mySQL - Blokowanie tabel a blokowanie wierszy
Opis aplikacji
Mam tabelę, która przechowuje identyfikatory, które reprezentują obszary na mapie. Każda mapa zawiera 1000 obszarów.Terytorium to dowolna liczba dotkniętych obszarów mapy. Użytkownicy walczą o prawo własności do różnych obszarów mapy.
Projekt bazy danych
Obecnie mam tabelę map, tabelę terytoriów i tabelę obszarów.
tblMaps: MapID, MapName
tblTerritories: TerrID (unique game wide), MapID, OwnerID, Status, Modified
tblAreas: AreaID (1-1000), TerrID
W chwili obecnej tblAreas przechowuje tylko zajęte obszary na mapie - nie zawiera 1000 rekordów na mapę, niezależnie od tego, czy ktoś jest jej właścicielem.
Gdy użytkownik próbuje przejąć na własność niektóre obszary, aplikacja musi połączyć się z trzema tabelami i zapytać o wszystkie obszary na tej mapie. Jeśli któryś z nich zostanie podjęty, powinien odrzucić próbę własności. Jeśli wszystkie obszary są wolne, należy utworzyć nowe terytorium i dodać odpowiedni obszar w tblAreas.
Problem
Zrozumiałem, że potrzebuję systemu opartego na transakcjach, aby dwóch użytkowników nie próbowało jednocześnie „posiadać” obszaru. O ile widzę, muszę albo zablokować całą tabelę obszaru, zapytać, czy obszary są wolne, wstawić nowe terytorium i jego obszar, zatwierdzić i odblokować tabelę ... LUB tabela Obszary powinna zawierać wszystkie 1000 obszary każdej mapy i blokady powinny być stosowane do wierszy tej mapy.
Mam nadzieję, że istnieje lepsza opcja, ponieważ o ile widzę. Zablokowanie tabeli oznacza, że wszystkie dane obszarowe są niedostępne dla tej drugiej lub z blokowaniem wiersza, tabela jest pełna bezużytecznych niezajętych obszarów.