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à cô lập. Để xem các mẫu mã giao dịch, hãy xem các giao dịch và hoạt động ghi theo lô thay vì.
Giao dịch và tình trạng tranh chấp dữ liệu
Để giao dịch thành công, các tài liệu mà thao tác đọc của giao dịch đó truy xuất 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.
- Tình trạng tranh chấp dữ liệu
- Khi 2 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 giữ nguyên 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 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 thao tác 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ố hữu hạn lần thử lại, 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 chế độ 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: 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ó thể xảy ra. 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.Với 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 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 đó. 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 thao tác ghi khác phải chờ giao dịch đó giải phóng khoá. Các giao dịch sẽ nhận khoá theo thứ tự thời gian.
OPTIMISTIC: 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 không hiệu quả khi giữ khoá cơ sở dữ liệu. 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 thay đổi dữ liệuVới chế độ kiểm soát đồng thời lạc quan, 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 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 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 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 chế độ đồng thời lạc quan.
- Thư viện ứng dụng máy chủ sử dụng chế độ kiểm soát đồng thời của chế độ cài đặt cơ sở dữ liệu.
Xem chế độ đồ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à
PESSIMISTIChoặcOPTIMISTIC. - PROJECT_ID là mã dự án Google Cloud của bạn.
- DATABASE_ID là mã cơ sở dữ liệu Cloud Firestore của bạn.
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 các đ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 xảy ra bất kể chế độ cài đặt đồ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 dành cho thiết bị 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 chế độ kiểm soát đồng thời lạc quan vì chúng có thể hoạt động trong các 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ế độ cài đặt đồ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 chế độ kiểm soát đồng thời lạc quan theo mặc định để hỗ trợ các thao tác quét trên toàn bộ bộ sưu tập. 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 Tiêu chuẩn sử dụng chế độ kiểm soát đồng thời bi quan và giả định độ trễ thấp và kết nối đáng tin cậy với cơ sở dữ liệu.
Cô lập theo tuần tự
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 độ xử lý xung đột giữa các thao tác đồng thời của hệ thống. Xung đột xuất phát 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 thao tác đồng thời.
Trong các hệ thống có cấp độ cô lập thấp, thao tác đọc trong 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 thao tác đồng thời.
Cô lập theo tuần tự xác định cấp độ cô lập cao nhất. Cô lập 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 không bị ảnh hưởng bởi các thay đổi chưa xác nhận 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 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 cô lập theo tuần tự 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.
Cô lập theo tuần tự 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 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 đều diễn ra chính xác vào thời điểm xác nhận.
Việc thực thi thực tế của 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 thao tác có thể trùng lặp. Cloud Firestore duy trì chế độ cô lập theo tuần tự 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 thao tác đồ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 thao tác đồng thời, Cloud Firestore sử dụng 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.
Cô lập trong giao dịch
Chế độ cô lập giao dịch cũng áp dụng cho các thao tác ghi trong giao dịch. Các truy vấn và hoạt động đọc trong giao dịch không thấy kết quả của các hoạt động ghi trước đó trong giao dịch đó. Ngay cả khi bạn sửa đổi hoặc xoá một tài liệu trong 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 thao tác ghi của giao dịch. Các thao tác đọc sẽ 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ố.