2010-01-04 36 views
5

Tôi biết rằng cách xử lý giao dịch DB trên công cụ ứng dụng là cung cấp cho các thực thể khác nhau giống nhau Parent (Nhóm thực thể) và sử dụng db.run_in_transaction.Trên công cụ ứng dụng của Google, làm cách nào để triển khai Giao dịch cơ sở dữ liệu?

Tuy nhiên, giả sử rằng tôi là không phải có thể cung cấp cho hai thực thể cùng một cha mẹ. Làm cách nào để đảm bảo rằng các cập nhật DB của tôi xuất hiện trong một giao dịch?

Có giải pháp kỹ thuật nào không? Nếu không, có một mẫu mà tôi có thể áp dụng không?

Lưu ý: Tôi đang sử dụng Python.

Trả lời

5

Miễn là các thực thể thuộc cùng một Nhóm, đây không phải là vấn đề. Từ docs:

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ể. Điều này bao gồm truy vấn cho các đối tượng theo tổ chức tổ tiên, truy xuất các đối tượng theo khóa, cập nhật đối tượng và xóa các đối tượng . Lưu ý rằng mỗi thực thể gốc thuộc về một nhóm tổ chức riêng biệt, do đó, một giao dịch không thể tạo hoặc hoạt động trên nhiều pháp nhân gốc. Để được giải thích về các nhóm tổ chức, xem Nhóm và nhóm thực thể.

Ngoài ra còn có một bài viết hay về Transaction Isolation in App Engine.

EDIT: Nếu bạn cần cập nhật thực thể với cha mẹ khác trong cùng một giao dịch, bạn sẽ cần thực hiện một cách để sắp xếp các thay đổi được thực hiện bởi chính bạn và quay ngược thủ công.

+0

Nhưng nếu bạn làm theo các "Keys và Entity Groups" liên kết đến http://code.google.com/appengine/docs/ python/datastore/keysandentitygroups.html # Entity_Groups_Ancestors_and_Paths, phương pháp duy nhất được liệt kê để đặt hai Thực thể trong cùng một Nhóm thực thể là đảm bảo chúng chia sẻ tổ tiên –

+0

Xin lỗi, giả sử về mặt kỹ thuật tôi có nghĩa là Nhóm chứ không phải cha mẹ. Nhưng có, theo cuốn sách tôi đọc nó xuất hiện rằng cách duy nhất để chỉ định các nhóm trong python là thông qua một tổ tiên chung/cha mẹ. – willem

+0

@James @Willem Cả hai đều đúng. Các thực thể được coi là một nhóm chỉ khi chúng chia sẻ cùng một nút gốc/gốc. Tôi đã chỉnh sửa câu trả lời của mình. – jbochi

2

Giao dịch trong hoạt động kho dữ liệu AppEngine khác với các giao dịch bạn có thể được sử dụng trong cơ sở dữ liệu SQL. Đối với một điều, giao dịch không thực sự khóa các thực thể mà nó đang hoạt động.

Bài viết Translation Isolation in App Engine giải thích điều này chi tiết hơn.

Vì lý do này, bạn sẽ muốn suy nghĩ khác về giao dịch - có thể bạn sẽ thấy rằng trong hầu hết các trường hợp bạn muốn sử dụng giao dịch hoặc không cần thiết muốn.

Để biết thêm thông tin về các nhóm tổ chức và mô hình lưu trữ dữ liệu, hãy xem How Entities and Indexes are Stored.

Handling Datastore Errors nói về những điều có thể khiến giao dịch không được cam kết và cách xử lý sự cố.

2

Một khả năng là thực hiện xử lý giao dịch của riêng bạn như bạn đã đề cập. Nếu bạn đang suy nghĩ về việc này, nó sẽ là giá trị thời gian của bạn để khám phá những công việc trước đó về vấn đề này.

http://danielwilkerson.com/dist-trans-gae.html

Dan Wilkerson cũng đã nói chuyện trên Google IO. Bạn sẽ có thể tìm thấy một đoạn video của cuộc nói chuyện.

+0

Rất hữu ích, cảm ơn Kris. – willem

3

Nếu bạn muốn giao dịch nhóm thực thể, bạn sẽ phải tự mình triển khai hoặc chờ thư viện để thực hiện chúng. Tôi đã viết an article cách đây một thời gian về cách triển khai các giao dịch nhóm thực thể trong trường hợp 'chuyển khoản ngân hàng'; nó cũng có thể áp dụng cho trường hợp sử dụng của bạn.

+0

+1 bài viết rất hay! cảm ơn bạn! – jbochi

Các vấn đề liên quan