对于游戏,我正在尝试实施分数表。根据游戏逻辑,当一个用户完成每几分钟发生一轮时,分数通常会改变;但不能保证两个用户同时完成。
为了不在每次用户检查分数时重新计算分数,我计划将分数数据保存在持久表中,每次完成一轮时都会更新。
我计划通过
实现这一点TRUNCATE TABLE scores; INSERT INTO SCORES SELECT ....
但我担心的是当两个用户同时完成时会发生什么。我在一个连接中传递整个查询(从ASP.NET,如果这很重要),但两个查询一起被视为原子?或者您是否建议我必须实施手动交易逻辑?
如果您建议进行交易,那么放置是否足以用“BEGIN TRAN ... END TRAN”包围查询,您是否建议MyISAM或InnoDB用于“得分”表?
如果重要的话,我的MySQL版本是5.0.92-log。
答案 0 :(得分:0)
只有在事务中执行时,两个查询才是原子查询。即便如此,他们只会在世界其他地方成为原子。在交易中,它仍然是两个完全独立的操作。
事务不会保护您免受两个+用户对数据集进行操作。您仍然需要在相关表上建立锁定以防止并发访问。