Bạn đã hỏi
dữ liệu không được cam kết được lưu trữ ở đâu, sao cho giao dịch READ_UNCOMMITTED có thể đọc dữ liệu không được cam kết từ một giao dịch khác?
Để trả lời câu hỏi của bạn, bạn cần biết Kiến trúc InnoDB trông như thế nào.
Hình ảnh sau đây được tạo ra cách đây nhiều năm bởi Percona CTO Vadim Tkachenko
Theo Tài liệu MySQL về Mô hình giao dịch và khóa InnoDB
CAM KẾT có nghĩa là những thay đổi được thực hiện trong giao dịch hiện tại được thực hiện vĩnh viễn và hiển thị cho các phiên khác. Mặt khác, một câu lệnh ROLLBACK hủy bỏ tất cả các sửa đổi được thực hiện bởi giao dịch hiện tại. Cả CommIT và ROLLBACK đều phát hành tất cả các khóa InnoDB đã được đặt trong giao dịch hiện tại.
Vì CAM KẾT và ROLLBACK chi phối khả năng hiển thị dữ liệu, ĐỌC CAM KẾT và ĐỌC KHÔNG HOÀN THÀNH sẽ phải dựa vào các cấu trúc và cơ chế ghi lại các thay đổi
- Phân đoạn rollback / Hoàn tác không gian
- Làm lại Nhật ký
- Các khoảng trống khóa chống lại (các) bảng có liên quan
Phân đoạn rollback và Hoàn tác không gian sẽ biết dữ liệu đã thay đổi trông như thế nào trước khi thay đổi được áp dụng. Nhật ký Redo sẽ biết những thay đổi nào sẽ được đưa ra để cập nhật dữ liệu.
Bạn cũng đã hỏi
tại sao giao dịch READ_COMMITTED không thể đọc dữ liệu không được cam kết, tức là thực hiện "đọc bẩn"? Cơ chế nào thi hành hạn chế này?
Làm lại Nhật ký, Hoàn tác không gian và các hàng đã khóa được sử dụng. Bạn cũng phải xem xét anh ấy Bộ đệm InnoDB (nơi bạn có thể đo các trang bẩn bằng innodb_max_denty_pages_pct , innodb_buffer_pool_pages_denty và innodb_buffer_pool_bytes_denty ).
Trong trường hợp này, ĐỌC CAM KẾT sẽ biết dữ liệu nào xuất hiện vĩnh viễn. Do đó, không cần phải tìm các trang bẩn mà không được cam kết. ĐỌC TIẾNG VIỆT sẽ không còn gì nữa khi một bản đọc bẩn đã được cam kết. ĐỌC UNCOMMITTED sẽ tiếp tục biết những hàng nào sẽ bị khóa và những bản ghi làm lại đã được đọc hoặc bỏ qua để làm cho dữ liệu hiển thị.
Để hiểu đầy đủ về Khóa hàng để quản lý cách ly, vui lòng đọc Mô hình giao dịch và khóa của InnoDB