2012-04-05 5 views
0

で持続的な変化を私は更新とPython用のbotoを使用して読み取ることSimpleDBのインスタンスを持っていることを確認します:後のBoto

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インスタンスに書き込まれていることを確認する方法を知っていますか?

ありがとうございました。

答えて

0

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

ただし、データの一貫性のある表示が必要であることをSimpleDBに伝える方法があります。必要であれば、それを待っています。クエリコードを少し変更することでこれを行うことができます。

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

これは常に最新の値を返します。

+0

ありがとう、それは完全に働いた。私はbotoバージョン1.9bを使用していたため、consistent_readを使用して問題に遭遇し、2.3.0にアップグレードして解決しました。 – angelrh