MariaDB 似乎正在鎖定所有表
我在 Windows 10 上本地執行 MariaDB。XAMPP 版本 3.2.4 和 MariaDB 版本 10.4.7
我正在將 MISAM 表移動到 INNODB 並試圖證明我們似乎遇到的鎖定問題將通過這一移動得到緩解。為了測試我寫了以下程式碼“鎖定”程式碼
SELECT * FROM temp LEFT JOIN (SELECT * FROM dbtable WHERE recordid=1 ) AS YY ON recordid=44564733
表 temp 是一個大表,表 dbtable 是我“鎖定”的表。它在recordid上是唯一的。
我在我的 wesbite 的一個會話中執行此程式碼,然後在另一個會話中我更新 dbtable2
INSERT INTO dbtable2 (field1) values ("hello")
插入是使用 PHP mysqli 進行的。
dbtable 可以是我數據庫中的任何表。它將阻止 dbtable2 的更新,直到選擇完成。如果 dbtable 和 dbtable2 相同並且表引擎是 MISAM,我會預料到會發生這種鎖定。但對我來說,dbtable 可以是任何表,引擎可以是 MISAM 或 INNODB,直到選擇完成後才會發生更新。
如果我在我的網站上執行“鎖定”程式碼(選擇),然後通過 HEIDISQL 訪問我的數據庫並在那裡執行更新查詢,則更新會立即發生。所以這讓我相信 PHP 或它的某種記憶體相關可能發生了一些事情。任何幫助表示讚賞。
- 一般日誌文件
48 Query SET NAMES utf8 48 Init DB dbname 48 Query SELECT * FROM Temp LEFT JOIN(SELECT * FROM dbtable WHERE RecordID=1) AS Rec ON RecordID=1 211113 16:36:59 49 Connect root@localhost as anonymous on dbname 49 Query SET NAMES utf8 49 Init DB dbname 50 Connect pma@localhost as anonymous on 51 Connect root@localhost as anonymous on 51 Query SELECT @@version, @@version_comment 51 Query SET NAMES 'utf8mb4' COLLATE 'utf8mb4_general_ci' 51 Query SET lc_messages = 'en_US' 50 Query SELECT `config_data`, UNIX_TIMESTAMP(`timevalue`) ts FROM `phpmyadmin`.`pma__userconfig` WHERE `username` = 'root' 51 Query SET collation_connection = 'utf8mb4_unicode_ci' 51 Quit 50 Quit 211113 16:37:06 48 Quit 211113 16:37:07 46 Quit 52 Connect root@localhost as anonymous on dbname 52 Query SET NAMES utf8 52 Init DB myfreeway 52 Query SET NAMES 'utf8' 52 Quit 53 Connect root@localhost as anonymous on dbname 53 Query SET NAMES utf8 53 Init DB dbname 53 Query INSERT statment of dbtable2 53 Quit 49 Quit
不要使查詢比它需要的更複雜:
SELECT * FROM temp AS t JOIN dbtable AS d ON t.??? = d.??? -- How are the tables related?? WHERE ??.recordid=1 AND ??.recordid=44564733
該
ON
子句可能表示這兩個表在某個列上對齊。該
WHERE
子句用於過濾。看兩次“記錄”是沒有意義的。請描述你在做什麼。每個表都需要一個
PRIMARY KEY
(它必須是“唯一的”並且是一個“索引”)。您可能需要一個索引recordid
以及ON
子句中的內容。是的,它會“阻塞直到完成”,但是有了合適的索引,它可能會非常快。
首先感謝所有試圖提供幫助的人。其次,很抱歉假設這是一個數據庫問題,因為我正在努力將數據庫表引擎從 MyISAM 更改為 InnoDB 以刪除鎖定,並且測試表明鎖定結果更糟。
問題與 PHP SESSION 參數有關。隨著
session_start()
系統鎖定會話文件,直到查詢完成時釋放。對於執行緩慢的查詢,這可以防止其他會話獲取會話表。訣竅是使用session_write_close()
. 這一切都被這位聰明的救世主解釋了。但請注意,啟動和關閉可能有其自身的缺點。以下是 PHP 文件的摘錄:
PHP 在每個 session_start 的響應頭中添加另一個相同的會話 cookie。這樣做足夠多次,您的響應標頭就會變得足夠大,足以阻塞 Web 伺服器。
我會做更多的實驗,但暫時這個問題已經解決了。