web e thường phải select ko sử dụng where với các column unique/primary, vậy thì gap lock nó sẽ lock all table ạ
Không đâu cậu. Tùy vào câu query mà nó sẽ lock các row có thể được đề cử.
Tớ presume cậu đang sử dụng default isolation level của InnoDB (repeatable read). Ở TH của cậu, cậu không có where clause, và dùng limit để giới hạn 2 bản ghi. Tớ không nghĩ InnoDB sẽ lock 2 bản ghi, mà nó sẽ căn cứ vào where clause của cậu (lấy tất cả bảng) và lock tất cả các record mà câu query có thể trả về (limit là thao tác xảy ra cuối cùng, sau khi câu query chạy xong), hoặc nó sẽ lock các row lân cận của record. Đó là phỏng đoán, và chỉ có thể được chứng minh khi cậu chạy câu lệnh để xem các row bị lock
Cậu có thể đọc thêm về behavior của gap locking ở đây
và nếu lock rows thì sao khi insert lại xảy ra deadlock nhỉ a
Nếu gap locking xảy ra (và tớ nghĩ nó đã xảy ra), thì cậu hoàn toàn có thể gặp deadlock
với cả hiện tại khi insert vào bảng đó từ nhiều session cùng lúc thì thi thoảng bị vài lần lỗi Deadlock ( ko phải thường xuyên)
Ừ cậu, lỗi concurency thường chỉ xảy ra một cách ngẫu nhiên và không đoán được.
và nếu set transaction isolation level xuống READ COMMITED, cách này có nhược điểm gì không ạ
Đây là 1 cách để disable gap lock mà tớ kể ở trên.
Tất nhiên, khi cậu set transaction isolation level xuống READ COMMITED, cậu sẽ gặp vấn đề với non repeatable read. Cậu cần cân nhắc để xem nó có ảnh hưởng tới các tính năng khác hay không. Cơ mà, READ COMMITED là default isolation level ở PostgreSQL, nên tớ không nghĩ có nhiều vấn đề đâu.
em chạy query a gửi nhưng lỗi không thấy table data_locks, e đang dùng mariadb 10.6
Uhm, tớ tưởng cậu dùng mysql cơ
Cậu thử tìm câu lệnh nào để xem được row lock ở mariaDb xem Tớ chưa search thử, nhưng nên có cách tương tự.