6

Tôi muốn xác nhận sự hiểu biết về tính nhất quán cuối cùng trong kho dữ liệu của Google. Giả sử rằng tôi đã là một thực thể được định nghĩa như sau (sử dụng NDB):Truy vấn Google Datastore và tính nhất quán cuối cùng

class Record(ndb.Model): 
    name = ndb.StringProperty() 
    content = ndb.BlobProperty() 

Tôi nghĩ rằng tôi hiểu kịch bản 1, nhưng tôi có nghi ngờ về kịch bản 2 và 3, vì vậy một số lời khuyên sẽ được đánh giá cao.

Kịch bản 1: Tôi chèn bản ghi mới có tên "Luca" và nội dung đã cho. Sau đó, tôi truy vấn kho dữ liệu:

qry = Record.query(name=="Luca") 
for r in qry.iter(): 
    logger.info("I got this content: %r" % r.content) 

Tôi hiểu rằng, do tính nhất quán cuối cùng, bản ghi được chèn vào có thể không phải là một phần của tập hợp kết quả. Tôi biết về việc sử dụng các truy vấn tổ tiên để vượt qua điều này nếu cần thiết.

Kịch bản 2: Tôi đã đọc Bản ghi có tên "Luca" hiện có, cập nhật nội dung và viết lại. Ví dụ, giả sử anh có chữ "k" quan trọng của hồ sơ này:

r = k.get() 
r.content = "new content" 
r.put() 

Sau đó, tôi chạy truy vấn tương tự như trong kịch bản 1. Khi tôi nhận được kết quả, giả định rằng kỷ lục là một phần của tập kết quả (ví dụ: vì chỉ mục đã chứa bản ghi có tên "Luca" và khóa k). Tôi có bảo đảm rằng nội dung của trường sẽ có giá trị mới "nội dung mới" không? Nói cách khác, nếu tôi cập nhật một bản ghi, chỉ để lại các trường khóa và chỉ mục của nó, tôi có được đảm bảo đọc giá trị gần đây nhất không?

Kịch bản 3: tôi làm tương tự như Kịch bản 2, một lần nữa với k là chìa khóa của một kỷ lục với tên "Luca":

r = k.get() 
r.content = "new content" 
r.put() 

nhưng sau đó tôi chạy một phiên bản sửa đổi của các truy vấn:

qry = Record.query(name=="Luca") 
for k in qry.iter(keys_only=True): 
    r = k.get() 
    logger.info("I got this content: %r" % r.content) 

Trong trường hợp này, logic cho tôi biết tôi nên nhận được giá trị mới nhất của nội dung, vì đọc theo khóa đảm bảo tính nhất quán cao. Tôi sẽ đánh giá cao sự xác nhận.

Trả lời

9

Kịch bản 1. Có, hiểu biết của bạn là chính xác.

Tình huống 2. Không, cùng truy vấn, do đó cuối cùng vẫn nhất quán.

Kịch bản 3. Có, hiểu biết của bạn là chính xác.

Ngoài ra, bạn có thể tránh sự nhất quán cuối cùng bằng cách thực hiện mọi thứ trong cùng một giao dịch, nhưng tất nhiên điều này có thể không áp dụng được.

+0

Aha, cảm ơn, rất thú vị. Vì vậy, có một sự khác biệt giữa thực hiện một truy vấn bình thường, và làm điều đó với keys_only = True và sau đó đọc từ khóa. – Luca

+0

có, đi qua khóa nên nhất quán ... tuy nhiên, tôi đã có vấn đề với rollback giao dịch ... (nếu một cái gì đó thất bại trong cam kết cam kết) nó không phải luôn luôn làm việc (với JDO - Java) ... tôi nghĩ tôi không làm điều đó sai .. nhưng suy nghĩ với mã google bản địa nó nên làm việc! – headgrowe

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