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

Trang này mô tả về sự tranh chấp dữ liệu giao dịch, khả năng tuần tự hoá và khả năng cô lập. Đối với các đoạn mã ví dụ về giao dịch, hãy xem giao dịch và các thao tác ghi theo lô.

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

Để một giao dịch thành công, các tài liệu mà hoạt động đọc của giao dịch đó truy xuất phải không bị sửa đổi bởi các hoạt động 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 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 tình trạng 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. Các thư viện ứng dụng Cloud Firestore tự động thử lại những 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 hữu hạn, 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ẽ thất bại hoặc bị trì hoãn, hành vi sẽ phụ thuộc vào loại thư viện ứng dụng.

  • Các 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 ứng dụng máy chủ sử dụng các chế độ kiểm soát đồng thời bi quan.

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

Cơ chế kiểm soát đồng thời lạc quan
Dựa trên giả định rằng việc 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 để ngă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ơ 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 ổ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.

Trong SDK dành cho thiết bị di động/web, 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 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ó 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 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 các chế độ kiểm soát đồng thời bi quan để giải quyết tình trạng tranh chấp dữ liệu.

Cơ chế kiểm soát đồng thời bi quan
Dựa trên giả định rằng có thể 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ì chúng 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 những tài liệu mà chúng đọc. Khoá giao dịch trên một tài liệu sẽ chặn các giao dịch khác, các thao tác ghi theo lô và các thao tác ghi không giao dịch 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 sẽ nhận được khoá theo thứ tự thời gian.

Cách ly có thể chuyển đổi tuần tự

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ách ly 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ý các xung đột giữa các thao tác đồng thời. Xung đột bắt nguồn từ các yêu cầu sau đây đối với cơ sở dữ liệu:

  • 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ác cơ sở dữ liệu sẽ thực hiện các thao tác đồng thời.

Trong các hệ thống có mức độ cô lập thấp, một 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 độ cô lập có thể chuyển đổi tuần tự xác định mức độ cô lập cao nhất. Mức độ cô lập 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 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 song song nhiều giao dịch. Cơ sở dữ liệu phải triển khai các chế độ 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 khả năng cô lập giao dịch có thể chuyển đổi 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 có thể tuần tự hoá 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 hoạt động đọc và ghi trong giao dịch diễn ra chính xác vào 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. 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ể trùng lặp. Cloud Firestore duy trì khả năng tách biệt có thể chuyển đổi tuần tự và đảm bảo rằng:

  • Cloud Firestore xác nhận giao dịch theo thứ tự theo 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 có thời gian cam kết sau.

Trong trường hợp xảy ra tranh chấp dữ liệu giữa các thao tác đồng thời, Cloud Firestore sẽ sử dụng các chế độ kiểm soát đồng thời bi quan và lạc quan để giải quyết tranh chấp.

Cô lập 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à thao tác đọc trong một giao dịch không thấy kết quả của các thao tác 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 thao tác đọ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 cam kết, 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ề 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ố.