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

Trang này mô tả sự tranh chấp dữ liệu giao dịch, khả năng chuyển đổi tuần tự và sự tách biệt. Để xem mã mẫu cho 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

Để giao dịch thành công, các tài liệu được truy xuất bằng thao tác đọc của giao dịch đó 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 những 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 một 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 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 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ề 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 sẽ không thành công hoặc bị trì hoãn, hành vi sẽ phụ thuộc vào loại kiểm soát đồng thời.

Chế độ kiểm soát đồng thời

Chế độ đồng thời là một tuỳ chọn cơ sở dữ liệu có thể định cấu hình. Cloud Firestore hỗ trợ các chế độ đồng thời sau:

  • PESSIMISTIC: Các chế độ kiểm soát đồng thời bi quan giả định rằng có khả năng xảy ra tranh chấp dữ liệu. 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.

    Với cơ chế kiểm soát đồng thời bi quan, các giao dịch sẽ đặt khoá trên những tài liệu mà chúng đọ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 không theo giao dịch khỏi việc thay đổi tài liệu đó. Một giao dịch sẽ giải phóng các khoá tài liệu tại thời điểm cam kết. Nó 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 nào.

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

  • OPTIMISTIC: Kiểm soát đồng thời lạc quan giả định rằng xung đột dữ liệu không có khả năng xảy ra hoặc việc giữ khoá cơ sở dữ liệu không hiệu quả. 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 thay đổi dữ liệu

    Với các chế độ kiểm soát đồng thời lạc quan, một giao dịch sẽ theo dõi tất cả tài liệu 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 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, thì giao dịch đó sẽ không thành công do tranh chấp dữ liệu.

Giá trị mặc định của chế độ đồng thời

Giá trị mặc định cho phiên bản Standard là PESSIMISTIC. Chế độ mặc định cho phiên bản Enterprise là OPTIMISTIC. Tuy nhiên, hành vi này cũng 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 lạc quan. SDK web và di động hoạt động độc lập với chế độ cài đặt này vì chúng luôn mô phỏng cơ chế đồng thời lạc quan.
  • Thư viện ứng dụng máy chủ sử dụng các chế độ kiểm soát đồng thời của chế độ cài đặt cơ sở dữ liệu.

Chế độ xem đồng thời

Chạy lệnh gcloud firestore databases describe để xem chế độ đồng thời phía máy chủ của cơ sở dữ liệu:

gcloud firestore databases describe \
  --project=PROJECT_ID \
  --database=DATABASE_ID

Thay đổi chế độ đồng thời

Chạy lệnh gcloud firestore databases update để thay đổi chế độ đồng thời phía máy chủ của cơ sở dữ liệu:

gcloud firestore databases update \
  --project=PROJECT_ID \
  --database=DATABASE_ID \
  --concurrency-mode=CONCURRENCY_MODE

trong đó:

  • CONCURRENCY_MODE là PESSIMISTIC hoặc OPTIMISTIC.
  • PROJECT_ID là mã của dự án Google Cloud.
  • DATABASE_ID là mã nhận dạng của cơ sở dữ liệu Cloud Firestore.

Xung đột dữ liệu trong SDK web/di động

SDK web và di động mô phỏng các giao dịch đồng thời lạc quan bằng cách sử dụng điều kiện tiên quyết ghi trên các phiên bản tài liệu. Quá trình mô phỏng này diễn ra bất kể chế độ cài đặt chế độ đồng thời của cơ sở dữ liệu. SDK dành cho thiết bị di động và web không sử dụng tính năng giao dịch tích hợp sẵn, vì vậy, ngay cả khi chế độ đồng thời của cơ sở dữ liệu được định cấu hình cho PESSIMISTIC, thì ứng dụng di động vẫn hoạt động theo cách lạc quan.

SDK dành cho thiết bị di động/web sử dụng các chế độ kiểm soát đồng thời lạc quan, vì các SDK này 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ẽ gây ra quá nhiều lỗi tranh chấp dữ liệu.

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

Thư viện ứng dụng máy chủ (C#, Go, Java, Node.js, PHP, Python, Ruby) sử dụng tính năng giao dịch tích hợp sẵn. Các giao dịch này sử dụng chế độ cài đặt chế độ đồng thời ở cấp cơ sở dữ liệu và chế độ mặc định phụ thuộc vào phiên bản:

  • Phiên bản Enterprise sử dụng các chế độ kiểm soát đồng thời lạc quan theo mặc định để hỗ trợ các thao tác quét toàn bộ tập hợp. Các chế độ kiểm soát đồng thời lạc quan giúp tránh các thao tác quét khoá trên một số lượng lớn tài liệu.

  • Phiên bản Standard sử dụng các chế độ kiểm soát đồng thời bi quan và giả định độ trễ thấp cũng như kết nối đáng tin cậy với cơ sở dữ liệu.

Mức độ cô lập có thể chuyển đổi tuần tự

Sự 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ủa cơ sở dữ liệu. Mức độ tách biệt của cơ sở dữ liệu mô tả mức độ hiệu quả của hệ thống trong việc xử lý xung đột giữa các hoạt động đồ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ơ sở dữ liệu sẽ thực thi các thao tác đồng thời.

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ừ các thay đổi chưa được xác nhận trong một thao tác đồng thời.

Mức độ tách biệt có thể chuyển đổi tuần tự xác định mức độ tách biệt cao nhất. Mức độ tách biệt có thể chuyển đổi 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 không bị ảnh hưởng bởi những thay đổi chưa được cam kết trong các thao tác đồng thời.

Đảm bảo này phải được duy trì 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 xung đột có thể phá vỡ sự đảm bảo này.

Cloud Firestore đảm bảo khả năng tách biệt có thể chuyển đổi 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 cam kết.

Mức độ tách biệt có thể chuyển đổi tuần tự theo thời gian cam kết

Cloud Firestore chỉ định 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 cam kết các thay đổi của giao dịch đối với cơ sở dữ liệu, bạn có thể giả định rằng tất cả các lượt đọc và ghi trong giao dịch đều diễn ra chính xác tại thời điểm cam kết.

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

  • Cloud Firestore cam kết giao dịch theo thứ tự 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 có thời gian cam kết muộn hơn.

Trong trường hợp xảy ra 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.

Sự tách biệt trong một giao dịch

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

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

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