歡迎 我的系統每天根據容量表中為每個國家指定的容量開放注冊,如果注冊人數大于指定容量則關閉注冊。我在laravel中使用了一個條件,如果容量更大,就不會保存在資料庫中 但是問題是如果同一秒內有多個用戶想要保存,就會超出容量和條件 你怎么解決這個問題?
uj5u.com熱心網友回復:
這更像是一個 SQL 問題而不是 Laravel 問題,您需要做的是鎖定您的表以進行寫入,在另一個表上進行查詢然后解鎖第一個
https://www.mysqltutorial.org/mysql-table-locking/
uj5u.com熱心網友回復:
你有一些選擇:
佇列
基本上所有的網路請求都被破壞者接收并將它們存盤在佇列中。然后訊息為偵聽器一一使用(服務器端語言。在您的情況下為 PHP)。所以無論同時收到多少個請求,你的后端都會一一處理
- https://laravel.com/docs/8.x/queues
- https://www.section.io/engineering-education/implementing-laravel-queues/
- https://dev.to/techparida/how-to-set-up-laravel-queues-on-production-4one
SQL:鎖定和解鎖表
為了提供并發控制并防止不受控制的資料訪問,所有資料庫(oracle、sqlserver、mysql 等)都允許您顯式獲取指定表上的共享或排他表鎖。表鎖持續到當前事務結束。
這里有一些 oracle 的片段:
LOCK TABLE Maps IN EXCLUSIVE MODE;
SELECT MAX(map_id) 1 FROM Maps;
INSERT INTO Maps . . .
您只需要撰寫 lock 陳述句或搜索為您撰寫它的框架。您需要閱讀許多理論和配置來選擇最適合您需求的:
- https://stackoverflow.com/a/30649232/3957754
- https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html
- https://docs.oracle.com/javadb/10.6.2.1/ref/rrefsqlj40506.html
- https://www.ibm.com/docs/en/db2/11.5?topic=management-locks-concurrency-control
- https://docs.microsoft.com/en-us/sql/relational-databases/sql-server-transaction-locking-and-row-versioning-guide?view=sql-server-ver15
執行緒級鎖
在另一種語言(如 java)中,有一些特性可以確保某些方法執行一段標記為 synchronized 的邏輯成為一個同步塊,在任何給定時間只允許一個執行緒執行。
- https://stackoverflow.com/a/4769769/3957754
- https://www.javatpoint.com/synchronization-in-java
public synchronized void synchronisedInsert() {
//logic
}
我發現在 php 上最相似的是:
- https://stackoverflow.com/a/30592885/3957754
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/394011.html
上一篇:Laravel-檢索外部表名
