Trang này mô tả về xung đột dữ liệu giao dịch, khả năng tuần tự hoá và tính tách biệt. Để biết các mẫu mã giao dịch, hãy xem phần giao dịch và ghi hàng loạt.
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.
- Xung đột 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 phải 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 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 xung đột 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 sẽ 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 các chế độ kiểm soát đồ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.
Xung đột 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ả năng xảy ra xung đột dữ liệu là không cao hoặc việc giữ khoá cơ sở dữ liệu là 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.
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 chế độ này 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 sẽ hoàn tất các thao tác ghi chỉ khi 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 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.
Xung đột 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 các chế độ kiểm soát đồng thời bi quan để giải quyết xung đột dữ liệu.
- Kiểm soát đồng thời 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.
Thư viện ứng dụng máy chủ sử dụng các chế độ kiểm soát đồng thời bi quan, vì các chế độ này giả định độ trễ thấp và kết nối đáng tin cậy với cơ sở dữ liệu.
Trong thư viện ứng dụng máy chủ, 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 tài liệu sẽ chặn các giao dịch khác, các hoạt động ghi hàng loạt và các hoạt động ghi không theo giao dịch 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. 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 sẽ nhận khoá theo thứ tự thời gian.
Cách ly 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. Cấp độ cô lập của cơ sở dữ liệu mô tả mức độ hiệu quả mà hệ thống xử lý xung đột giữa các hoạt động đồ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ơ sở dữ liệu 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.
Cách ly theo tuần tự xác định mức cách ly cao nhất. Tính năng 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 tuần tự.
- Các giao dịch không bị ảnh hưởng bởi những thay đổi chưa được xác nhận trong các thao tác đồng thời.
Cam đoan này phải được giữ nguyên ngay cả khi cơ sở dữ liệu thực thi song song nhiều giao dịch. 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 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ả các hoạt động đọc và ghi trong giao dịch diễn ra chính xác tại thời điểm xác nhận.
Việc thực thi giao dịch thực tế cần một khoảng thời gian. Quá trình thực thi giao dịch bắt đầu trước thời gian xác nhận và quá trình thực thi nhiều thao tác có thể trùng lặp. Cloud Firestore duy trì tính năng tách biệt có thể tuần tự hoá và đảm bảo rằng:
- Cloud Firestore xác nhận các giao dịch theo thứ tự thời gian xác nhận.
- 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 xung đột dữ liệu giữa các thao tác đồng thời, Cloud Firestore sử dụng các chế độ kiểm soát đồng thời lạc quan và bi quan để giải quyết xung đột.
Tách biệt trong 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 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á một tài liệu trong một giao dịch, 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 xác nhận, trước khi các thao tác ghi của giao dịch diễn ra. Các thao tác đọc sẽ không trả về giá trị nào nếu tài liệu không tồn tại tại 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 vấn đề này, hãy xem trang khắc phục sự cố.