Tôi đang gặp vấn đề trong đó nhiều bản cập nhật MySQL được thực hiện cùng một lúc sẽ bị khóa và mất vài phút để hoàn tất. Tôi đang sử dụng InnoDB, vì vậy tôi bối rối không biết tại sao điều này có thể xảy ra vì mỗi bản cập nhật chỉ cập nhật 1 hàng. Tôi cũng đang sử dụng một ví dụ RDS m2.4xlund (lớn nhất họ đến).
Đây là những gì tôi đang làm: Tôi có một bảng có khoảng 100 triệu hàng trong đó, với "lượt xem" là một cột (được lập chỉ mục) và tôi muốn cập nhật lượt xem trên khoảng 1 triệu hàng. Trên một số máy chủ khác nhau, tôi có một vòng lặp như thế này trong đó mỗi máy chủ có bộ hàng được cập nhật riêng (mã giả):
mysql("set autocommit=0");
mysql("start transaction");
foreach($rows as $row) {
mysql("update table set views=views+1 where id=$row[id]");
}
mysql("commit");
Vòng lặp này thông qua tất cả các hàng cần được cập nhật. Nó hoạt động hoàn hảo khi số lượng máy chủ nhỏ, khoảng 4, nhưng khi nó tăng lên 10+ thì các bản cập nhật bắt đầu bị treo ở trạng thái "Cập nhật" cùng một lúc. Không có gì nói rằng nó đang chờ khóa, nó chỉ là "Đang cập nhật". Điều này xảy ra trong khoảng 5 phút, nơi cuối cùng nó sẽ thực hiện các bản cập nhật và tiếp tục qua vòng lặp và cuối cùng lại xảy ra.
Tôi không tìm cách thay thế để thực hiện cập nhật. Có những thứ như bảng tmp và
update table,tmp_table set table.views = table.views+tmp_table.views where
table.id = tmp_table.id
khóa tất cả các hàng đang được cập nhật cho đến khi tất cả kết thúc (có thể là hàng giờ), điều này sẽ không hiệu quả với tôi. Họ PHẢI ở trong những vòng lặp khủng khiếp này.
Tôi đang tự hỏi tại sao họ có thể bị kẹt trong trạng thái "Đang cập nhật" và tôi có thể làm gì để ngăn chặn điều đó.
tldr; Có hơn 10 vòng "cập nhật" cuối cùng sẽ khóa tất cả các cập nhật đang được thực hiện, đồng thời, vì một lý do không xác định cho đến khi cuối cùng họ quyết định thực hiện cập nhật và tiếp tục qua các vòng lặp, chỉ để nó xảy ra một lần nữa sau đó.
HIỂN THỊ BIỂU TƯỢNG: http://pastebin.com/NdmAeJrz
HIỂN THỊ TÌNH TRẠNG TÌNH TRẠNG ĐỘNG CƠ: http://pastebin.com/Ubwu4F1h