0

Python用のbotoを使用して更新および読み取りを行うSimpleDBインスタンスがあります。

    sdb = boto.connect_sdb(access_key, secret_key)
    domain = sdb.get_domain('DomainName')
    itemName = 'UserID'
    itemAttr = {'key1': 'val1', 'key2': val2}
    userDom.put_attributes(itemName, itemAttr)

それは期待どおりに機能します。名前が「UserID」で値がval1とval2の新しいアイテムがドメインに挿入されます。

今、私が直面している問題は、属性を更新した直後にそのドメインを照会すると、

    query = 'select * from `DomainName` where key1=val1'
    check = domain.select(query)
    itemName = check.next()['key2']

行の値が見つからなかったため、エラーが発生します。ただし、書き込みと読み取りの間にtime.sleep(1)を追加すると、すべてが機能します。

この問題は、put_atributesがデータベースに書き込みを通知するという事実が原因であると思われますが、この変更が永続化されるまで待機しません。また、アイテムを作成してからそのアイテム(item.save())を保存して書き込もうとしましたが、あまり成功しませんでした。次の操作に進む前に、SimpleDBインスタンスに値が書き込まれていることを確認する方法を知っている人はいますか?

ありがとう。

4

1 に答える 1

0

ここでの問題は、SimpleDBがデフォルトで結果整合性があることです。したがって、データを書き込んですぐに読み取ろうとすると、最終的にデータの一貫性が保証されますが、最新のデータを取得することは保証されません。SimpleDBの場合、最終的には通常1秒未満を意味しますが、それにかかる時間は保証されません。

ただし、データの一貫したビューが必要であり、必要に応じてそれを待機することをいとわないことをSimpleDBに通知する方法があります。これを行うには、クエリコードを少し変更します。

query = 'select * from `DomainName` where key1=val1'
check = domain.select(query, consistent_read=True)
itemName = check.next()['key2']

これは常に最新の値を返す必要があります。

于 2012-04-05T13:35:14.150 に答える