2013-11-24 12 views
12

Giả sử tôi có hai người dùng đang cố gắng truy cập vào bảng trong cơ sở dữ liệu được gọi là "nhận xét" theo thứ tự sau:Làm rõ sự khác biệt giữa khóa cấp hàng trong công cụ InnoDB và khóa bảng ở động cơ MyISAM trong cơ sở dữ liệu MySQL

  1. User1 được xây dựng và cập nhật cho một kỷ lục với id = 10

    cẬP NHẬT comments SET comment = "Hello World" WHERE id = 10

  2. User2 đang thực hiện một lựa chọn cho tất cả các hàng của cùng một bảng bình luận

    SELECT * FROM comments

tôi muốn thảo luận về sự khác biệt giữa các trường hợp sau:

  1. Nếu động cơ của bảng là MyISAM: truy vấn Update sẽ khóa toàn bộ bảng mà sẽ xếp hàng truy vấn chọn cho đến khi cập nhật của hàng được hoàn thành và sau đó nó sẽ được thực hiện sẽ dừng bất kỳ người dùng yêu cầu bất cứ điều gì từ bảng này cho đến khi cập nhật là hoàn tất.
  2. Nếu động cơ của bảng là InnoDB: truy vấn cập nhật sẽ khóa hàng được cập nhật.

TÔI MUỐN BIẾT LÀM THẾ NÀO KHÓA KHÓA NÀY CÓ HIỆU QUẢ ???

Ý tôi là nếu chọn yêu cầu cơ sở dữ liệu cho toàn bộ bản ghi của bảng nhận xét và tìm thấy một trong số chúng (id = 10) bị khóa thì cơ sở dữ liệu sẽ xếp hàng truy vấn chọn một lần nữa cho đến khi cập nhật xong?

Nếu có thì sự khác biệt giữa hai công cụ là gì ??

Nếu không, tôi muốn nói rằng tôi có tình huống tương tự ở trên trang web của mình và thậm chí tôi đã thay đổi công cụ bảng từ MyISAM thành InnoDB nhưng vấn đề xếp hàng bất kỳ yêu cầu nào khi có cập nhật hoặc truy vấn chèn vẫn xảy ra.

Mọi giải thích cho tình huống này sẽ hữu ích. cảm ơn bạn trước

+0

Trong ví dụ của bạn, lựa chọn phải chờ cập nhật để hoàn thành cho cả hai công cụ. Nó sẽ khác nếu truy vấn chọn không bao gồm bản ghi có ID 10 (được khóa bởi bản cập nhật), trong trường hợp này lựa chọn MyISAM phải đợi, nhưng InnoDB thì không. "Tính năng này trong InnoDB được gọi là đồng thời" - http://stackoverflow.com/a/28070969/934739 –

Trả lời

1

Trong InnoDB, tùy thuộc vào việc giao dịch có được bật hay không. InnoDB có tính năng MVCC có nghĩa là trong khi luồng 1 đang cập nhật, luồng 2 có thể đọc mà không cần khóa.

này đã được trả lời ở đây InnoDB's row locking the same as MVCC Non-Blocking Reads?

nếu giao dịch bị vô hiệu hóa, cùng với MyISAM? Tôi đoán vậy nhưng không chắc chắn.

+0

Tất cả các bảng của tôi được thay đổi thành InnoDB, Có thể bảng là InnoDB nhưng giao dịch bị vô hiệu hóa không?Nếu có Làm thế nào tôi có thể tìm hiểu nếu nó bị vô hiệu hóa hay không và làm thế nào để kích hoạt nó – Basel

+0

@Basel tôi có nghĩa là nếu autocommit tắt sau đó kết nối hiện tại 'giao dịch bị vô hiệu hóa. để sử dụng giao dịch, "SET autocommit = 0; START TRANSACTION; UPDATE ....; COMMIT;" –

0

Trong Innodb trong kịch bản của bạn kết quả sẽ đến cho truy vấn chọn nhưng với dữ liệu cũ cho hàng nơi id = 10 nếu không được cập nhật. Kết quả sẽ không dừng lại.

Các vấn đề liên quan