【问题标题】:Is SELECT synchronous or asynchronous?SELECT 是同步的还是异步的?
【发布时间】:2014-04-25 15:48:02
【问题描述】:

我正在开发一款多人游戏,我想通过数据库中的一项研究将两个彼此不认识的玩家联系起来。所以我想这样做:

  • 想要与随机对手比赛的玩家点击我的应用程序上的按钮。
  • 按下按钮时,我会在“randomPlayers”表中的数据库中控制是否有人可以玩
  • 如果表中没有玩家,我将昵称放在数据库中等待想玩的人
  • 相反,如果有人存储在数据库中,我会取第一个昵称(按时间戳排序)并使用它。

我的问题是:我如何确定在同一时刻搜索随机玩家的两个玩家会选择两个不同的玩家而不是相同的玩家,因为 SELECT 返回相同的玩家? 也就是说SELECT是同步的还是异步的?

【问题讨论】:

  • 对不起,我没有解释清楚..我改变我的问题
  • 我已更改您的标题以反映您的真实问题以及标签。
  • 谢谢你..你是对的

标签: php mysql select concurrency


【解决方案1】:

我希望你做的是 3 层设计,而不是 2 层。例如。程序是连接中间的服务器连接数据库(3层),还是程序直接连接数据库(2层)?

如果是 2 层,您可能必须将选择包装在某种事务中,该事务会抓取玩家并更新表格,这样第二个请求就不会抓取同一个玩家。旁注,您可能需要考虑切换到 3 层设计,以便更好地管理用户可以和不可以对您的数据库执行的操作。

如果是 3 层,您可能可以通过使用您用于在中间构建服务器的语言提供的某种锁定系统来避免这一切。大多数现代编程语言现在都提供了一些语法,允许您指定一次只有一个线程应该运行一段给定的代码,从而允许您管理这些类型的并发问题。

MySQL concurrency也考虑这个问题

【讨论】:

  • 是的,我当然使用 3 层。我的应用程序通过 WebService 与在 MySql 数据库中读取和写入的 PHP 页面进行通信,然后我从 web 服务向我的应用程序进行回复。在这种情况下,我该怎么做?
  • 由于 PHP 并没有真正进行多线程处理(对数据库的两个请求不应同时运行),将多个 SQL 语句放入一个事务中就足够了。类似这样的伪 sql:START TRANSACTION;选择玩家;更新播放器; ——还是删除?你比我更了解你的桌子。提交;
  • 但是如果 PHP 不是多线程的,那么当很多用户同时请求相同的东西时,数据库不会有非常慢的响应的危险吗?
  • 我不确定。这个问题超出了我的专业范围。您可能会考虑在问题中添加 PHP 标记以吸引具有该经验的人。
猜你喜欢
  • 2020-05-15
  • 2020-02-21
  • 2013-02-25
  • 2012-12-30
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
  • 2017-06-22
  • 1970-01-01
相关资源
最近更新 更多