Mariadb

MariaDB 似乎正在鎖定所有表

  • November 16, 2021

我在 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 伺服器。

我會做更多的實驗,但暫時這個問題已經解決了。

引用自:https://dba.stackexchange.com/questions/302555