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

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

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

Để một giao dịch thành công, tài liệu được truy xuất bởi các thao tác đọc phải không bị sửa đổi bởi các thao tác bên ngoài giao dịch. Nếu một thao tác khác cố gắng thay đổi một trong các tài liệu đó, thì thao tác đó sẽ chuyển sang 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 tài liệu để duy trì tính nhất quán trong khi một thao tác đồng thời 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 tranh chấp 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 số lần thử lại nhất định, thao tác giao dịch sẽ không thành công và trả về một thông báo lỗi:

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ễ, 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 các chế độ kiểm soát đồng thời tối ưu.

  • Thư viện máy khách củ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

Các SDK dành cho thiết bị di động/web (nền tảng Apple, Android, Web, C++) sử dụng các biện pháp kiểm soát đồng thời lạc quan để giải quyết tranh chấp 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 không có khả năng tranh chấp dữ liệu hoặc việc giữ khoá cơ sở dữ liệu không hiệu quả. Các giao dịch lạc quan không sử dụng khoá cơ sở dữ liệu để chặn các thao tác khác làm 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 ổn định. Việc khoá tài liệu trong môi trường có độ trễ cao sẽ dẫn đến quá nhiều lỗi tranh chấp dữ liệu.

Trong SDK web/thiết bị di động, giao dịch theo dõi tất cả các tài liệu bạn đọc bên trong giao dịch đó. Giao dịch sẽ hoàn tất thao tác ghi chỉ khi không có tài liệu nào trong số đó được thay đổi trong quá trình thực thi giao dịch. Nếu có bất kỳ tài liệu nào thay đổi, trình xử lý giao dịch sẽ thử lại giao dịch đó. Nếu không thể nhận được kết quả rõ ràng sau một vài lần thử lại, thì giao dịch đó sẽ bị thất bại 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 nghiêm ngặt để 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. Các giao dịch bi quan sử dụng khoá cơ sở dữ liệu để ngăn các thao tác khác sửa đổi dữ liệu.

Các thư viện ứng dụng của máy chủ sử dụng các biện pháp kiểm soát đồng thời mã hoá vì các thư viện này có độ trễ thấp và có 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ẽ khoá các tài liệu mà các giao dịch đó đọc. Khoá của một giao dịch trên một tài liệu sẽ chặn các giao dịch khác, các lượt ghi theo lô và các lượt ghi phi giao dịch làm thay đổi tài liệu đó. Một giao dịch sẽ huỷ bỏ khoá tài liệu vào thời gian cam kết. Tệp này cũng huỷ khoá nếu hết thời gian chờ hoặc bị lỗi 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 huỷ bỏ khoá. Các giao dịch sẽ khoá lại theo thứ 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 mức độ tách biệt cơ sở dữ liệu. Mức cách ly của cơ sở dữ liệu mô tả khả năng hệ thống xử lý xung đột giữa các thao tác đồng thời. Xung đột xuất phát từ 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 các hệ thống có mức độ tách biệt 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 trong một thao tác đồng thời.

Cách ly theo tuần tự xác định mức cách ly cao nhất. Việc tách biệt theo tuần 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.

Đảm bảo này phải 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ỡ sự đảm bảo này.

Cloud Firestore đảm bảo việc tách biệt các giao dịch theo tuần tự. Các giao dịch trong Cloud Firestore được chuyển đổi tuần tự và tách biệt theo thời gian cam kết.

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

Cloud Firestore gán cho mỗi giao dịch một thời gian cam kết, đại diện cho một thời điểm duy nhất. Khi Cloud Firestore thay đổi một giao dịch đối với cơ sở dữ liệu, bạn có thể giả định rằng tất cả lượt đọc và ghi trong giao dịch đó đều diễn ra chính xác tại 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à việc thực thi nhiều thao tác có thể chồng chéo nhau. Cloud Firestore duy trì tính năng tách biệt theo tuần tự và đảm bảo rằng:

  • Cloud Firestore cam kết 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 cam kết sau này.

Trong trường hợp tranh chấp dữ liệu giữa các hoạt động đồ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à lượt đọc bên trong một giao dịch sẽ không thấy kết quả của các lượt 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ả nội dung đọc tài liệu trong giao dịch đó sẽ trả về phiên bản của tài liệu trong thời gian cam kết, trước khi thực hiện 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ố.