Mô tả đồng thời

Đã hoàn thành

Tính năng cốt lõi của cơ sở dữ liệu nhiều người dùng là đồng thời. Đồng thời sử dụng khóa và chặn để cho phép dữ liệu luôn nhất quán với nhiều người dùng cùng cập nhật và đọc dữ liệu cùng một lúc. Ví dụ: vì chi phí vận chuyển, tất cả các sản phẩm của chúng tôi đều có mức tăng giá $5. Đồng thời, do tỷ giá tiền tệ, tất cả các sản phẩm đều có mức% giảm giá. Nếu các bản cập nhật này xảy ra cùng một lúc, giá cuối cùng sẽ biến đổi và có khả năng có nhiều lỗi. Khi sử dụng khóa, bạn có thể đảm bảo rằng một bản cập nhật sẽ hoàn tất trước khi bản cập nhật kia bắt đầu.

Đồng thời xảy ra ở cấp độ giao dịch. Giao dịch viết có thể chặn các giao dịch khác cập nhật và thậm chí đọc cùng một dữ liệu. Bằng nhau, một giao dịch đọc có thể chặn các độc giả khác hoặc thậm chí là một số nhà văn. Vì lý do này, điều quan trọng là phải tránh các giao dịch hoặc giao dịch quá dài, bao hàm lượng dữ liệu quá lớn.

Có nhiều cấp độ cô lập giao dịch cụ thể có thể được sử dụng để xác định cách một hệ thống cơ sở dữ liệu xử lý nhiều người dùng. Đối với mục đích của mô-đun này, chúng ta sẽ xem xét các loại rộng về mức độ cô lập, khóa lạc quan và khóa bi quan.

Ghi

Chi tiết đầy đủ về khóa giao dịch ngoài đồng thời liên quan nhiều hơn đến hiệu suất và không chỉ phụ thuộc vào mã - mặc dù mã tốt hoạt động tốt hơn. Vui lòng xem lại Hướng dẫn Khóa Giao dịch SQL Server và Lập phiên bản Hàng chuyên sâu để biết thêm chi tiết. Để biết thông tin về việc chặn, hãy xem lại tài liệu về Hiệu suất SQL Server.

Đồng thời lạc quan

Với việc khóa kỳ vọng có giả định rằng sẽ có một số bản cập nhật xung đột xảy ra. Vào đầu giao dịch, trạng thái ban đầu của dữ liệu được ghi lại. Trước khi giao dịch được cam kết, trạng thái hiện tại được so sánh với trạng thái ban đầu. Nếu các trạng thái giống nhau, giao dịch đã hoàn tất. Nếu các trạng thái khác nhau, giao dịch sẽ được quay lui.

Ví dụ: bạn có một bảng chứa các đơn hàng năm trước. Dữ liệu này không thường xuyên được cập nhật, nhưng báo cáo được chạy thường xuyên. Bằng cách sử dụng khóa lạc quan, các giao dịch không chặn lẫn nhau và hệ thống chạy hiệu quả hơn. Rất tiếc, đã tìm thấy lỗi trong những năm trước cần thực hiện dữ liệu và bản cập nhật. Trong khi một giao dịch đang cập nhật mỗi hàng, một giao dịch khác thực hiện chỉnh sửa nhỏ cho một hàng duy nhất cùng một lúc. Bởi vì trạng thái của dữ liệu đã được thay đổi trong khi giao dịch ban đầu đang chạy, toàn bộ giao dịch được quay lui.

Đồng thời bi quan

Với khóa bi quan có một giả định rằng nhiều bản cập nhật đang xảy ra với dữ liệu cùng một lúc. Bằng cách sử dụng khóa, chỉ một bản cập nhật có thể xảy ra cùng một lúc và việc đọc dữ liệu bị ngăn chặn trong khi các bản cập nhật đang diễn ra. Điều này có thể ngăn chặn quay lui lớn, như hiển thị trong ví dụ trước, nhưng có thể khiến truy vấn bị chặn không cần thiết.

Điều quan trọng là phải xem xét bản chất dữ liệu của bạn và các truy vấn đang chạy trên dữ liệu khi quyết định sử dụng đồng thời lạc quan hoặc bi quan để đảm bảo hiệu suất tối ưu.

Cách ly ảnh chụp nhanh

Có năm cấp độ cách ly khác nhau trong SQL Server, nhưng đối với mô-đun này, chúng tôi sẽ chỉ tập trung vào các READ_COMMITTED_SNAPSHOT_OFF và READ_COMMITTED_SNAPSHOT_ON. READ_COMMITTED_SNAPSHOT_OFF là mức cách ly mặc định cho SQL Server. READ_COMMITTED_SNAPSHOT_ON là mức cô lập mặc định cho Cơ sở dữ liệu Azure SQL.

READ_COMMITTED_SNAPSHOT_OFF sẽ giữ khóa trên các hàng bị ảnh hưởng cho đến khi kết thúc giao dịch nếu truy vấn đang sử dụng mức độ cô lập giao dịch đã cam kết đọc. Mặc dù có thể xảy ra một số cập nhật, chẳng hạn như tạo một hàng mới, điều này sẽ ngăn hầu hết các thay đổi xung đột đối với dữ liệu đang được đọc hoặc cập nhật. Đây là sự đồng thời bi quan.

READ_COMMITTED_SNAPSHOT_ON chụp nhanh dữ liệu. Sau đó, các bản cập nhật sẽ được thực hiện trên ảnh tức thời cho phép các kết nối khác truy vấn dữ liệu gốc. Vào cuối giao dịch trạng thái hiện tại của dữ liệu được so sánh với ảnh chụp nhanh. Nếu dữ liệu giống nhau, giao dịch được cam kết. Nếu dữ liệu khác nhau, giao dịch sẽ được quay lui.

Để thay đổi mức cách ly thành READ_COMMITTED_SNAPSHOT_ON hiện lệnh sau:

ALTER DATABASE *db_name* SET READ_COMMITTED_SNAPSHOT ON;

Để thay đổi mức cách ly thành READ_COMMITTED_SNAPSHOT_OFF vấn đề, hãy thực hiện lệnh sau:

ALTER DATABASE *db_name* SET READ_COMMITTED_SNAPSHOT OFF;

Nếu cơ sở dữ liệu đã được thay đổi để bật đọc ảnh chụp nhanh cam kết, bất kỳ giao dịch nào sử dụng mức độ cô lập đọc cam kết mặc định sẽ sử dụng khóa lạc quan.

Ghi

Snapshot cô lập chỉ xảy ra cho đọc cam kết giao dịch. Các giao dịch sử dụng các mức độ cách ly khác không bị ảnh hưởng.