Описание применения
У меня есть таблица, в которой хранятся идентификаторы, представляющие области на карте. Каждая карта содержит 1000 областей. Территория - это любое количество областей карты, которые касаются . Пользователи сражаются за владение разными участками карты.
Разработка базы данных
В настоящее время у меня есть таблица карт, таблица территорий и таблица областей.
tblMaps: MapID, MapName
tblTerritories: TerrID (unique game wide), MapID, OwnerID, Status, Modified
tblAreas: AreaID (1-1000), TerrID
В настоящее время tblAreas хранит только занятые области на картах - он не содержит 1000 записей на карту независимо от того, принадлежит ли она кому-либо.
Когда пользователь пытается завладеть некоторыми областями, приложение должно объединить три таблицы и запросить все занятые области на этой карте. Если какой-либо из них будет взят, он должен отклонить его попытку собственности. Если все области свободны, должна быть создана новая территория и соответствующая область добавлена в табличные области.
Задача
Я понял, что мне нужна система на основе транзакций, чтобы два пользователя не пытались «владеть» областью одновременно. Теперь, насколько я вижу, я должен либо заблокировать всю таблицу Area, запросить, свободны ли области, вставить новую территорию и ее области, зафиксировать ее и разблокировать таблицу ... ИЛИ Таблица Areas должна содержать все 1000 области каждой карты и блокировки должны быть применены только к строкам этой карты.
Надеюсь, есть лучший вариант, потому что, насколько я вижу. Блокировка таблицы будет означать, что все данные области недоступны в течение этой секунды, или при блокировке строки таблица заполнена бесполезными незанятыми областями.