应用描述
我有一个存储地图区域id的表格。每个地图包含1000个区域。 领地是指地图上任意数量相邻的区域。用户争夺地图上不同区域的所有权。
数据库设计
目前,我拥有一个地图表、一个领地表和一个区域表。
tblMaps: MapID, MapName
tblTerritories: TerrID (unique game wide), MapID, OwnerID, Status, Modified
tblAreas: AreaID (1-1000), TerrID
目前,tblAreas仅存储地图中的占用区域 - 不管是否有人拥有它,它都不包含每个地图的1000条记录。
当用户尝试拥有某些区域时,应用程序必须连接三个表并查询该地图中所有已占用的区域。如果其中任何一个被占用,则应拒绝他的所有权尝试。如果所有区域都是空闲的,则应创建一个新领土,并在tblAreas中添加相关区域。
问题
我意识到我需要一个基于事务的系统,以便两个用户不会同时尝试“拥有”该区域。现在据我所见,我必须锁定整个Area表,查询看看区域是否空闲,插入新的领土及其区域,提交并解锁表...或者Areas表应包含每个地图的所有1000个区域,并且锁定应仅应用于该地图的行。
希望有更好的选择,因为据我所见,锁定表将意味着所有区域数据在那一秒钟内都无法访问,或者使用行锁定,表中充满了无用的未占用区域。