Việc sử dụng chính các nhóm tổ chức là cung cấp phương tiện để cập nhật nhiều hơn một thực thể trong một giao dịch.
Nếu bạn không phải sử dụng chúng, hãy đếm các phước lành của bạn. Hoặc bạn đã thiết kế mô hình dữ liệu của mình sao cho không có hai thực thể nào cần được cập nhật cùng một lúc để duy trì tính nhất quán hoặc nếu bạn cần chúng nhưng bạn đã nhận được may mắn :)
Hãy tưởng tượng rằng tôi có một loại thực thể hóa đơn và một loại thực thể LineItem. Một hóa đơn có thể có nhiều LineItems được liên kết với nó. Pháp nhân Hóa đơn của tôi có một trường có tên LastUpdated. Bất cứ khi nào LineItem được thêm vào hóa đơn của tôi, tôi muốn lưu trữ ngày hiện tại trong trường LastUpdated.
chức năng cập nhật của tôi có thể trông như thế này (giả)
invoice.lastUpdated = now()
lineitem = new lineitem()
invoice.put()
lineitem.put()
gì xảy ra nếu đặt hóa đơn() thành công và đặt chi tiết đơn hàng() không? Ngày lập hóa đơn của tôi sẽ cho thấy rằng một cái gì đó đã được cập nhật, nhưng bản cập nhật thực tế (LineItem mới) sẽ không có ở đó. Giải pháp là đặt cả hai hàm put() vào trong một giao dịch.
Một giải pháp thay thế sẽ là sử dụng truy vấn để tìm ngày của mục hàng được chèn vào cuối cùng, thay vì lưu trữ dữ liệu này trong trường Cập nhật lần cuối. Nhưng điều đó sẽ liên quan đến việc tìm nạp cả Invoice và tất cả các LineItems mỗi lần bạn muốn biết lần cuối cùng một lineitem được thêm vào, khiến bạn tốn kém hạn ngạch kho dữ liệu quý giá.
CHỈNH SỬA ĐỂ TRẢ LỜI KẾT QUẢ CỦA POSTER
Ah. Tôi nghĩ rằng tôi hiểu sự nhầm lẫn của bạn. Các đoạn trên thiết lập lý do tại sao các giao dịch là quan trọng. Nhưng bạn nói rằng bạn vẫn không quan tâm đến các nhóm thực thể, bởi vì bạn không thấy chúng liên quan đến các giao dịch như thế nào. Nhưng nếu bạn đang sử dụng db.run-in-transaction, thì bạn đang sử dụng các nhóm thực thể, có lẽ không nhận ra nó! Mỗi giao dịch liên quan đến một và chỉ một nhóm thực thể và bất kỳ giao dịch cụ thể nào đều chỉ có thể ảnh hưởng đến các thực thể thuộc cùng một nhóm. thấy here
"Tất cả các hoạt động kho dữ liệu trong một giao dịch phải hoạt động trên các đối tượng trong nhóm cùng một thực thể".
Bạn đang làm những việc gì trong giao dịch của mình? Có rất nhiều lý do chính đáng để sử dụng giao dịch chỉ với một Thực thể, theo mặc định là trong Nhóm thực thể của riêng nó.Nhưng đôi khi bạn cần phải giữ 2 hoặc nhiều thực thể đồng bộ, như trong ví dụ trên. Nếu Invoice và các đối tượng LineItem không nằm trong cùng một nhóm thực thể, thì bạn không thể bọc các sửa đổi cho chúng trong một cuộc gọi db.run-in-transaction. Vì vậy, bất cứ lúc nào bạn muốn hoạt động trên 2 hoặc nhiều thực thể giao dịch, trước tiên bạn cần phải chắc chắn rằng họ đang ở trong cùng một nhóm. Hy vọng rằng làm cho nó rõ ràng hơn lý do tại sao chúng rất hữu ích.
Tôi đã sử dụng db.run_in_transaction (xem http://code.google.com/appengine/docs/python/datastore/functions.html) cho các giao dịch (hoặc dĩ nhiên get_or_insert cho trường hợp đặc biệt đó, xem thêm http : //code.google.com/appengine/docs/python/datastore/transactions.html) - lợi thế của các nhóm thực thể là gì? –
ouch! downvote đầu tiên của tôi. lợi thế của các nhóm thực thể đối với các giao dịch là các giao dịch không hoạt động bên ngoài các nhóm thực thể. nếu bạn đã sử dụng giao dịch, thì bạn đã sử dụng các nhóm thực thể, ngay cả khi chỉ ngầm định. mỗi thực thể nằm trong một nhóm theo mặc định. các giao dịch được giới hạn trong phạm vi ảnh hưởng đến một nhóm thực thể tại một thời điểm. tôi đã chỉnh sửa câu trả lời của tôi với một lời giải thích dài hơn. –
Tại sao điều này lại được bình chọn? Đó là một câu trả lời hay. –