Chuyển đến nội dung chính
Mô-đun 11 · Bài học 4 trong tổng số 444/57 trong khóa học~12 min
Bài học theo mô-đun (4/4)

Mức độ cách ly

Ngoài ĐỂ CẬP NHẬT rõ ràng, các giao dịch còn có các quy tắc toán học bẩm sinh được đưa sâu vào công cụ chi phối lượng năng lượng cần sử dụng để tách biệt từng tương tác riêng lẻ theo mặc định. Đây được gọi là Mức cô lập. Trong thế giới SQL, chúng ta biết 4 tiêu chuẩn, theo thứ tự sức mạnh và an toàn nhưng rõ ràng là ngược lại về hiệu suất.

  • READ UNCOMMITTED: Thật điên rồ, giao dịch của bạn sẽ thấy mọi thay đổi do người khác thực hiện, bao gồm cả dữ liệu tạm thời từ những người đang thực hiện nửa chừng tập lệnh của chính họ. Không ai sử dụng nó trên các DB lớn vì liên tục xảy ra lỗi Dirty Read.
  • READ COMMITTED: (Mặc định cho Postgres). Bạn sẽ thấy ngay dữ liệu mới ngay khi bên thứ ba đưa ra CAM KẾT, nhưng bạn có thể trở thành nạn nhân của các lần đọc ảo (xem các bản ghi mới giữa chừng trong quy trình công việc dài của bạn) hoặc chế độ xem nhất quán phi tuyến tính.
  • REPEATABLE READ: Nặng hơn. Trong suốt phiên cửa sổ thời gian lớn của bạn, tôi "thấy" cơ sở dữ liệu bị đóng băng tại thời điểm truy vấn của tôi bắt đầu, hoàn toàn bỏ qua và coi thường ngay cả những cam kết chính thức được người khác hoàn thành! Nó bảo vệ chống lại các hồ sơ xuất hiện một cách kỳ diệu, đảm bảo sự ổn định.
  • SERIALIZABLE: Cấp thần (Siêu chậm). Xử lý mọi giao dịch chồng chéo bằng cách chặn chúng và thực hiện chúng một cách tuần tự trên một làn đường, hủy bỏ một cách tàn nhẫn những giao dịch va chạm, loại bỏ tận gốc ngay cả khả năng khoa học về va chạm nhỏ nhất, hy sinh 90% thông lượng cao.

Làm thế nào để bạn thiết lập nó?

Thay vì BEGIN; thông thường, bạn gõ:

SQL
BEGIN ISOLATION LEVEL SERIALIZABLE;

-- and you proceed normally with your hermetically sealed isolation
UPDATE products SET stock = 10;
COMMIT;

Hoặc trong một số biến thể và động cơ cũ hơn, bạn chỉ định nó sau khi khởi động:

SQL
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

Hãy tự mình thử

tập thể dục#sql.m11.l4.e1
Nỗ lực: 0Đang tải…

Bắt đầu một giao dịch chính thức thiết lập cấp độ toàn cầu trong suốt thời gian tồn tại của truy vấn thành REPEATABLE READ để tạo một trao đổi được bảo vệ, cố định.\nHãy nhớ rằng ở cấp độ truy vấn, nó không phục vụ mục đích nào trừ khi được theo dõi bởi một mục đích khác, vì vậy hãy đóng nó trống bằng 'COMMIT'.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Mở bằng BEGIN ISOLATION LEVEL REPEATABLE READ; và đóng bằng COMMIT;

Giải pháp khả dụng sau 3 lần thử

tập thể dục#sql.m11.l4.e2
Nỗ lực: 0Đang tải…

Hãy thử mức độ tuần tự hóa điên rồ và chèn một số dữ liệu hư cấu.\nMở khối 'SERIALIZABLE'.\nCập nhật tên danh mục Id=2 thành 'Nuovo Nome Segreto'.\nChạy nguyên tử cuối cùng, giải quyết cam kết.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

BẮT ĐẦU MỨC ĐỘ Cô lập CÓ THỂ SERIALIZABLE;\nCẬP NHẬT danh mục SET name = 'Nuovo Nome Segreto' WHERE id = 2;\nCOMMIT;

Giải pháp khả dụng sau 3 lần thử