2014-03-19 170 views
1

我正在開發一款多人遊戲,我想通過數據庫中的研究連接兩個互不認識的玩家。所以我想這樣做:SELECT是同步的還是異步的?

  • 想玩隨機對手的玩家點擊我的應用程序上的按鈕。
  • 當按鈕被按下時,我控制我的'randomPlayers'表中的數據庫,如果有人玩
  • 如果沒有播放器存儲在表中我把暱稱放在數據庫中等待某人想玩
  • 如果相反,有人存儲在數據庫中我採取第一個暱稱(按時間戳排序),我玩它。

我的問題是:我如何確定在同一時刻搜索隨機玩家的兩名玩家需要兩個不同的玩家,因爲SELECT會返回同一個玩家? 也就是說SELECT是同步的還是異步的?

+0

對不起,我沒有很好地解釋這個問題..我改變我的問題 –

+0

我已經改變了你的標題,以反映您的真正的問題,以及標籤。 – Prix

+0

謝謝你..你說得對 –

回答

1

我希望你正在做3層設計,而不是2層。例如。程序是否連接到連接數據庫的中間服務器(3層),還是程序直接連接到數據庫(2層)?

如果是2層,您可能必須將某些事務封裝在抓取玩家並更新表的第二個請求不會抓取同一玩家的事務中。注意,您可能需要考慮切換到3層設計,以便您更好地管理用戶可以和不可以對數據庫執行的操作。

如果是3層,您可以通過使用您用來在中間構建服務器的語言提供的某種鎖定系統來避免這一切。大多數現代編程語言現在都提供了一些語法,允許您指定一次只有一個線程應該運行給定的代碼,從而允許您管理這些類型的併發問題。

而且考慮MySQL concurrency

+0

當然,我使用3層。我的應用程序通過WebService與通過MySql數據庫讀寫的PHP頁面進行通信,然後從Web服務接收我的應用程序回覆。在這種情況下,我該怎麼做? –

+0

因爲PHP並沒有真正執行多線程(兩個數據庫請求不應該同時運行),所以將多個SQL語句放入事務中就足夠了。像這樣的僞sql: START TRANSACTION; SELECT Player; 更新播放器; - 或刪除?你比我更瞭解你的桌子。 COMMIT; –

+0

但是,如果PHP不是多線程的,那麼當很多用戶同時請求相同的東西時,數據庫沒有很慢的答案的危險? –

相關問題