Tính năng tuần tự hoá và cách ly giao dịch

Trang này mô tả việc tranh chấp dữ liệu giao dịch, khả năng chuyển đổi tuần tự và tách biệt. Để xem mã giao dịch mẫu, hãy xem giao dịch và ghi theo lô.

Giao dịch và tranh chấp dữ liệu

Để giao dịch thành công, các tài liệu được truy xuất bằng các thao tác đọc của giao dịch phải không bị các thao tác bên ngoài giao dịch sửa đổi. Nếu một nhãn khác cố gắng thay đổi một trong các tài liệu đó, thì thao tác đó sẽ được nhập trạng thái tranh chấp dữ liệu với giao dịch.

Tranh chấp dữ liệu
Khi hai hoặc nhiều thao tác cạnh tranh để kiểm soát cùng một tài liệu. Ví dụ: một giao dịch có thể yêu cầu chứng từ để duy trì tính nhất quán trong khi vẫn sẽ cố gắng cập nhật các giá trị trường của tài liệu đó.

Cloud Firestore giải quyết xung đột dữ liệu bằng cách trì hoãn hoặc không thực hiện được một trong các thao tác. Thư viện ứng dụng Cloud Firestore tự động thử lại các giao dịch không thành công do tranh chấp dữ liệu. Sau một có giới hạn số lần thử lại, thao tác giao dịch sẽ không thành công và trả về lỗi thông báo:

ABORTED: Too much contention on these documents. Please try again.

Khi quyết định thao tác nào không thành công hoặc bị trì hoãn, hành vi sẽ phụ thuộc vào loại thư viện ứng dụng.

  • SDK dành cho thiết bị di động/web sử dụng mô hình đồng thời lạc quan .

  • Thư viện máy khách phía máy chủ sử dụng các biện pháp kiểm soát đồng thời mô phỏng.

Tranh chấp dữ liệu trong SDK dành cho thiết bị di động/web

SDK di động/web (nền tảng Apple, Android, Web, C++) sử dụng các chế độ kiểm soát đồng thời lạc quan để giải quyết xung đột dữ liệu.

Kiểm soát đồng thời một cách lạc quan
Dựa trên giả định rằng tranh chấp dữ liệu không có khả năng xảy ra hoặc không có thể lưu giữ các khoá cơ sở dữ liệu. Các giao dịch lạc quan không sử dụng cơ sở dữ liệu khoá để chặn các thao tác khác thay đổi dữ liệu.

SDK dành cho thiết bị di động/web sử dụng các biện pháp kiểm soát đồng thời lạc quan vì chúng có thể hoạt động trong môi trường có độ trễ cao và kết nối mạng không đáng tin cậy. Việc khoá tài liệu trong môi trường có độ trễ cao sẽ gây ra quá nhiều lỗi tranh chấp dữ liệu.

Trong SDK dành cho thiết bị di động/web, một giao dịch sẽ theo dõi tất cả tài liệu mà bạn đọc trong giao dịch đó. Giao dịch chỉ hoàn tất các thao tác ghi nếu không có tài liệu nào trong số đó thay đổi trong quá trình thực thi giao dịch. Nếu có tài liệu đã thay đổi, trình xử lý giao dịch sẽ thử lại giao dịch. Nếu giao dịch không thể nhận được kết quả rõ ràng sau một vài lần thử lại, giao dịch không thành công do tranh chấp dữ liệu.

Tranh chấp dữ liệu trong thư viện ứng dụng của máy chủ

Các thư viện ứng dụng của máy chủ (C#, Go, Java, Node.js, PHP, Python, Ruby) sử dụng các biện pháp kiểm soát đồng thời mang tính bi quan sẽ giải quyết tranh chấp dữ liệu.

Biện pháp kiểm soát đồng thời một cách bi quan
Dựa trên giả định rằng có khả năng xảy ra tranh chấp dữ liệu. Bi quan giao dịch sử dụng khoá cơ sở dữ liệu để ngăn chặn các thao tác khác sửa đổi dữ liệu.

Thư viện máy khách của máy chủ dùng các biện pháp kiểm soát đồng thời bi quan vì chúng giả định độ trễ thấp và kết nối đáng tin cậy đến cơ sở dữ liệu.

Trong thư viện máy khách của máy chủ, giao dịch sẽ được khoá trên các tài liệu mà chúng đã đọc. Khoá của một giao dịch trên một tài liệu chặn các giao dịch khác, các lượt ghi hàng loạt và các lượt ghi phi giao dịch từ việc thay đổi tài liệu đó. Đáp giao dịch sẽ huỷ bỏ khoá tài liệu vào thời gian cam kết. Phương thức này cũng giải phóng các khoá nếu hết thời gian chờ hoặc không thành công vì bất kỳ lý do gì.

Khi một giao dịch khoá một tài liệu, các thao tác ghi khác phải chờ giao dịch đó giải phóng khoá. Các giao dịch có được khoá trình tự thời gian.

Cách ly theo tuần tự

Tranh chấp dữ liệu giữa các giao dịch có liên quan chặt chẽ đến việc tách biệt cơ sở dữ liệu cấp độ. Mức cách ly của cơ sở dữ liệu mô tả mức độ hiệu quả của hệ thống xử lý xung đột giữa các thao tác đồng thời. Xung đột xảy ra do các yêu cầu sau đây về cơ sở dữ liệu:

  • Giao dịch cần có dữ liệu chính xác và nhất quán.
  • Để sử dụng tài nguyên một cách hiệu quả, các cơ sở dữ liệu sẽ thực thi đồng thời các thao tác.

Trong những hệ thống có mức độ cô lập thấp, thao tác đọc trong một giao dịch có thể đọc dữ liệu không chính xác từ những thay đổi chưa được xác nhận một cách đồng thời hoạt động.

Tính năng cô lập có thể chuyển đổi tuần tự xác định cấp độ cô lập cao nhất. Theo tuần tự tách biệt có nghĩa là:

  • Bạn có thể giả định rằng cơ sở dữ liệu thực thi các giao dịch theo chuỗi.
  • Các giao dịch sẽ không chịu ảnh hưởng của những thay đổi chưa được xác nhận trong các hoạt động đồng thời.

Lệnh đảm bảo này phải được lưu giữ ngay cả khi cơ sở dữ liệu thực thi nhiều giao dịch song song. Cơ sở dữ liệu phải triển khai các biện pháp kiểm soát đồng thời để giải quyết các xung đột có thể phá vỡ cam kết này.

Cloud Firestore đảm bảo tính năng cô lập tuần tự của các giao dịch. Các giao dịch trong Cloud Firestore được chuyển đổi tuần tự và tách biệt theo thời gian xác nhận.

Cách ly tuần tự theo thời gian cam kết

Cloud Firestore chỉ định thời gian cam kết cho mỗi giao dịch, đại diện cho một thời điểm duy nhất. Khi Cloud Firestore thực hiện các thay đổi đối với cơ sở dữ liệu, bạn có thể giả định tất cả lượt đọc và ghi trong giao dịch diễn ra chính xác vào thời gian cam kết.

Việc thực thi giao dịch thực tế cần một khoảng thời gian. Việc thực thi một giao dịch bắt đầu trước thời gian cam kết và thực thi nhiều các hoạt động có thể trùng lặp. Cloud Firestore duy trì việc tách biệt theo tuần tự và đảm bảo rằng:

  • Cloud Firestore thực hiện các giao dịch theo thứ tự theo thời gian cam kết.
  • Cloud Firestore tách biệt các giao dịch khỏi các thao tác đồng thời với thời gian xác nhận sau.

Trong trường hợp tranh chấp dữ liệu giữa các thao tác đồng thời, Cloud Firestore sử dụng các biện pháp kiểm soát đồng thời lạc quan và bi quan để giải quyết tranh chấp.

Tách biệt trong giao dịch

Việc tách biệt giao dịch cũng áp dụng để ghi các thao tác trong giao dịch. Các truy vấn và đọc bên trong một giao dịch sẽ không thấy kết quả của các lần ghi trước đó trong giao dịch đó. Ngay cả khi bạn sửa đổi hoặc xoá tài liệu trong một giao dịch, tất cả tài liệu đọc trong giao dịch đó sẽ trả về phiên bản của tài liệu tại thời điểm cam kết, trước thao tác ghi của giao dịch. Các thao tác đọc sẽ không trả về giá trị nào nếu khi đó tài liệu không tồn tại.

Vấn đề về tranh chấp dữ liệu

Để biết thêm thông tin về tranh chấp dữ liệu và cách giải quyết vấn đề, hãy xem trang khắc phục sự cố.