簡體   English   中英

您將如何構造此php-mysql查詢?

[英]How would you construct this php - mysql query?

我正在做一個基於回合的游戲,並試圖構建一個匹配功能,當玩家選擇與一個隨機的對手一起玩時。 我是MySQL的菜鳥,所以我需要一些幫助。

我正在考慮這樣做:

  1. 當玩家選擇與隨機對手對抗時,請查看“ waiting_list”表以查看是否有對手。

  2. 如果沒有對手,則將玩家添加到等待名單中。

  3. 如果在等待名單上有一個對手,從名單上刪除該玩家,然后與其他玩家開始游戲。

我擔心的是,如果我這樣做,那么候補名單上的同一位選手是否有可能會被幾位選手選中。 想象一下,如果有100,000名玩家選擇了自動匹配功能,那么數據庫(phpmyadmin)是否可以正常處理? 您將如何構建邏輯?

謝謝

我擔心的是,如果我這樣做,那么候補名單上的同一位選手是否有可能會被幾位選手選中。

用1.)到3.)要點描述的是所謂的“業務交易”,這里有一個原子操作,一次只能由一個玩家執行。

因此,您應該將操作封裝到處理它的對象中,以便在業務邏輯中有一個接口可以執行該事務。

然后,您需要實施交易。 事務可以成功或失敗,您可以使用返回值或異常來處理失敗。

交易本身必須確保消除您的顧慮。 在MySQL中,可以通過排他地鎖定比賽表,進行比賽,刪除播放器/對手或將其添加到等待列表並釋放鎖定來完成。

12.3.5。 LOCK TABLESUNLOCK TABLES語法文件

表鎖具有性能影響,因為只要表被鎖定,其他會話就無法訪問它(等待直到鎖被釋放)。

因此,保持鎖定時間短是明智的。 如果事務需要10毫秒,則可以將其乘以並發活動事務的數量,以及時表示性能:

0.010 seconds * 100 000 transactions = ~ 16.7 minutes

請注意,您不可能有10萬個並發交易,因為並非所有玩家都一次匹配。 但是,您需要跟蹤數字,因為一段時間后系統可能會停頓。

為了幫助防止單個玩家進入多個游戲,您可以為等待列表添加“ GameIDAssigned”的附加列(如果尚未添加),默認為0(甚至是PlayAgainstPerson)。

在查詢可用於並顯示給許多玩家的數據時,記錄可能都具有相似的時間戳,但您只需要1。因此,以某種隨機方法選擇一個,然后在等於時間戳且沒有游戲的情況下分配ID分配。 如果返回1條記錄已更新,則為您的記錄。 如果已將其分配給其他人,則將填寫GameIDAssigned,從而防止您再次進行分配。 如...

PersonIDFromWaitingList = SomeValueEvenIfBySQLSubSelect

Update YourWaitingListTable
   set GameIDAssigned = SomeCurrentGameIDSequence
   where DateTimeStampColumn = ValueWhenOriginallyQueried
     AND GameIDAssigned = 0

在沒有看到游戲結構或表格列的任何其他元素的情況下,我目前無法提供更多功能,但是希望您能充分理解。 如果試圖同時由多個人分配一個候補名單人,則只有第一個完成更新的人(而gameIDAssigned仍為0)獲勝,而其他嘗試獲取該人的人將錯過並需要嘗試下一個可用...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM