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

Trang này mô tả về tình trạng tranh chấp dữ liệu giao dịch, khả năng tuần tự hoá và khả năng cô lập. Để xem các đoạn mã giao dịch mẫu, hãy xem các giao dịch và hoạt động ghi theo lô thay thế.

Giao dịch và tình trạng tranh chấp dữ liệu

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

Tình trạng tranh chấp dữ liệu
Khi hai hoặc nhiều hoạt động 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 phải nhất quán trong khi một hoạt động đồ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 tình trạng tranh chấp dữ liệu bằng cách trì hoãn hoặc làm cho một trong các hoạt động đó không thành công. 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 tình trạng tranh chấp dữ liệu. Sau một số lần thử lại hữu hạn, hoạt động 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 hoạt động 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 cơ chế kiểm soát đồng thời.

Cơ 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ơ chế kiểm soát đồng thời bi quan giả định rằng tình trạng tranh chấp dữ liệu có khả năng xảy ra. Các giao dịch bi quan sử dụng khoá cơ sở dữ liệu để ngăn các hoạt động 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 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 sẽ chặn các giao dịch khác, hoạt động ghi theo lô và hoạt động ghi không giao dịch thay đổi tài liệu đó. Một giao dịch sẽ giải phóng khoá tài liệu tại thời điểm xác nhận. Giao dịch cũng sẽ giải phóng 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 hoạt động ghi khác phải đợi giao dịch giải phóng khoá. Các giao dịch sẽ nhận khoá theo thứ tự thời gian.

  • OPTIMISTIC: Cơ chế kiểm soát đồng thời lạc quan giả định rằng tình trạng tranh chấp 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ả. Các giao dịch lạc quan không sử dụng khoá cơ sở dữ liệu để chặn các hoạt động khác thay đổi dữ liệu

    Với cơ chế kiểm soát đồng thời lạc quan, một giao dịch sẽ theo dõi tất cả các tài liệu mà bạn đọc trong giao dịch. Giao dịch chỉ hoàn tất các hoạt động 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ó 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 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 tình trạng 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 Tiêu chuẩn là PESSIMISTIC. Giá trị mặc định cho phiên bản Doanh nghiệp 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ơ chế kiểm soát đồng thời lạc quan. SDK dành cho thiết bị di động và web hoạt động độc lập với chế độ cài đặt này vì chúng luôn mô phỏng tính đồng thời lạc quan.

  • Thư viện ứng dụng máy chủ sử dụng cơ chế kiểm soát đồng thời của chế độ cài đặt cơ sở dữ liệu.

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

SDK dành cho thiết bị di động và web 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, ứng dụng di động vẫn hoạt động một cách lạc quan.

SDK dành cho thiết bị di động/web sử dụng cơ chế 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.

Tình trạng 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ế độ đồng thời ở cấp cơ sở dữ liệu và giá trị mặc định phụ thuộc vào phiên bản:

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

  • Phiên bản Tiêu chuẩn sử dụng 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.

Khả năng cô lập tuần tự hoá

Tình trạng tranh chấp dữ liệu giữa các giao dịch có liên quan chặt chẽ đến các cấp độ cô lập cơ sở dữ liệu. _Cấp độ cô lập_ của cơ sở dữ liệu mô tả mức độ hệ thống xử lý xung đột giữa các hoạt động đồng thời. Xung đột đến từ các yêu cầu sau đây của cơ sở dữ liệu:

  • Các giao dịch yêu cầu 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 hoạt động đồng thời.

Trong các hệ thống có cấp độ cô lập thấp, một hoạt động đọ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 xác nhận trong một hoạt động đồng thời operation.

Khả năng cô lập tuần tự hoá xác định cấp độ cô lập cao nhất. Khả năng cô lập tuần tự hoá 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 các thay đổi chưa xác nhận trong các hoạt động đồ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ơ chế kiểm soát đồng thời để giải quyết các xung đột có thể phá vỡ đảm bảo này.

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

Khả năng cô lập tuần tự hoá theo thời gian xác nhận

Cloud Firestore chỉ định cho mỗi giao dịch một thời gian xác nhận đại diện cho một thời điểm duy nhất. Khi Cloud Firestore xác nhận các thay đổi của một giao dịch đối với cơ sở dữ liệu, bạn có thể giả định rằng tất cả hoạt động đọc và ghi trong giao dịch diễn ra chính xác vào thời gian xác nhận.

Việc thực thi thực tế một giao dịch đòi hỏi một khoảng thời gian nhất định. Việc thực thi một giao dịch bắt đầu trước thời gian xác nhận và việc thực thi nhiều hoạt động có thể trùng lặp. Cloud Firestore duy trì khả năng cô lập tuần tự hoá và đảm bảo rằng:

  • Cloud Firestore xác nhận các giao dịch theo thứ tự theo thời gian xác nhận.
  • Cloud Firestore cô lập các giao dịch khỏi các hoạt động đồng thời có thời gian xác nhận sau đó.

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ơ chế kiểm soát đồng thời lạc quan và bi quan để giải quyết tình trạng tranh chấp.

Khả năng cô lập trong một giao dịch

Khả năng cô lập giao dịch cũng áp dụng cho các hoạt động ghi trong một giao dịch. Các truy vấn và hoạt động đọc bên trong một giao dịch không thấy kết quả của các hoạt động 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, tất cả hoạt động đọc tài liệu trong giao dịch đó sẽ trả về phiên bản của tài liệu tại thời điểm xác nhận, trước các hoạt động ghi của giao dịch. Hoạt động đọc không trả về gì nếu tài liệu không tồn tại vào thời điểm đó.

Vấn đề về tình trạng 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 tình trạng này, hãy xem trang khắc phục sự cố.