4 Mức Độ Cô Lập Theo Chuẩn SQL (và MySQL hỗ trợ tất cả!) | CỰU CHIẾN BINH ĐI QUA GIÔNG BÃO CÔNG NGHỆ

Nội dung bài viết

Video học lập trình mỗi ngày

Đây là câu thứ 6 mà tôi nhận được lời phỏng vấn cho level junior với hai vị trí FS và BE.

Bạn có thể tự trả lời và xem cách này có tốt hơn bạn nghĩ không? Tuần tới tôi đi Interview

Ngoài ra tiêu chuẩn UDP và TCP được đặt ngang hàng với kiến thức dưới đây, chú ý...

Tại sao lại cần Mức Độ Cô Lập?

Để đơn giản cho việc hiểu về MVCC thì có một kịch bản như sau, cùng một thời điểm thì

  • User X đang xem giá và số lượng sản phẩm Z còn hay không trên hệ thống YYYY.
  • User Y đang order sản phẩm Z và giảm số lượng tồn kho trên hệ thông YYYY
  • Admin P đang update số lượng hàng tồn kho của Z vì hàng mới về Lô mới...

Có 3 tác vụ đồng thời xảy ra một tài nguyên chung, vì vậy nếu không có cơ chế cô lập tốt, người dùng A có thể thấy số lượng tồn kho trước khi người dùng B hoàn tất mua hàng, hoặc thấy giá đang được cập nhật dở dang. Điều này dẫn đến dữ liệu không nhất quán.

Nhất quán ở nhiều cấp độ lập trình

Ở đây chúng ta bàn luận về khía cạnh nhất quán ở cấp cuối cùng đó là database. Thật ra đây là cách đảm bảo không được lịch sự cho lắm, vì nếu DBS làm việc cật lực lắm thì không nên, nhưng chỉ bàn luận về cấp độ MYSQL. Còn tốt nhất thì có 3 phương pháp đảm bảo tính nhất quán khi order sản phẩm thì bạn có thể xem code triển khai tại đây.

Còn đây là hiểu về 4 khái niệm bạn nên trang bị cho mình trước khi thiết kế hệ thống.

Khuyến nghị: MVCC xử lý các vấn đề đồng thời của MySQL như thế nào?Dựng hiện trường tai nạn

Tiêu chuẩn SQL định nghĩa 4 mức độ cô lập, sắp xếp từ thấp đến cao về mức độ bảo vệ dữ liệu:

  1. READ UNCOMMITTED (Đọc Dữ Liệu Chưa Commit) Đây là mức "thoáng" nhất. Giao dịch ở mức này có thể đọc cả những thay đổi chưa được commit (lưu vĩnh viễn) bởi các giao dịch khác. Theo tôi thì không nên sử dụng trong thực tế vì quá rủi ro về dữ liệu nhất quán. Khi dự án của bạn giống như trong video thực hành đó là không quá quan trọng về tính nhất quán thì nên sử dụng, khi đó hiệu suất tốt hơn.

  2. READ COMMITTED (Đọc Dữ Liệu Đã Commit) Đặc điểm: Chỉ đọc những dữ liệu đã được commit. An toàn hơn nhiều! Lưu ý: Đây là mức mặc định của nhiều CSDL phổ biến như Oracle, SQL Server, PostgreSQL.

  3. REPEATABLE READ (Đọc Lặp Lại) Đặc điểm: Đảm bảo rằng nếu bạn đọc đi đọc lại cùng một (tập) dữ liệu trong suốt giao dịch của mình, kết quả sẽ luôn giống nhau (trừ khi chính bạn thay đổi nó). Nên thực tế, REPEATABLE READ trên InnoDB mạnh hơn so với định nghĩa chuẩn.

  4. SERIALIZABLE (Tuần Tự Hóa) Có thể nói là đây là mức cô lập cao nhất, an toàn nhất. Các giao dịch được thực thi như thể chúng xếp hàng lần lượt, không có sự xen kẽ nào gây xung đột. Nhưng bạn có thể xem phần cuối của vụ tai nạn thì nó sẽ đánh đổi đó chính là hiệu năng đồng thời bị ảnh hưởng nhiều nhất, vì các giao dịch có thể phải chờ đợi nhau, chỉ giải quyết xong mới tiếp tục giải quyết transaction khác...

Cuối cùng, nếu như bạn chưa hiểu về 4 khái niệm trên làm việc thế nào thì đơn giản hãy xem các nó hoạt động thế nào thông qua bài viết này: MVCC xử lý các vấn đề đồng thời của MySQL như thế nào?Dựng hiện trường tai nạn

Có thể bạn đã bị missing