2010-10-05 103 views
1

我遇到RENAME語句與CREATE TABLE語句衝突導致死鎖的問題。MySQL RENAME和CREATE TABLE語句發生衝突問題

我有形式

CREATE TABLE `ProductTitles` 
(
    PRIMARY KEY (`ProductId`), 
    INDEX (`Title`, `ProductScore`) 
)  
SELECT p.ProductId, p.Title, ps.ProductScore 
FROM Products p 
JOIN ProductScores ps USING (ProductId) 

由於表大小的CREATE TABLE語句,這可能需要大約30分鐘才能完成。

RENAME TABLE 
Products TO ProductsOld, 
ProductsNew TO Products 

此重命名的語句然後鎖定Products表進行讀取和寫入,直到:

的問題時,當另一個進程嘗試使用以下格式的重命名聲明,以取代Products表此語句運行時出現CREATE TABLE語句已完成。

我的問題是如何避免這種情況?

是否可以使用鎖,或者查詢是否存在CREATE TABLE語句,以避免在CREATE語句完成之前運行RENAME語句?

據我所知,無論是使用MyISAM還是InnoDb,都會發生這種情況。必須有一些機制來防止這種情況的發生。

回答

0

如果你使用MyISAM計數()是非常快的,你可以的產品,以ProductTitles大小試圖重命名

0

重命名錶是不是最好的方式做你正在做什麼之前比較。使用腳本將產品中的所有數據寫入ProductsOld並將其從產品中刪除會更好。