我有一个SimpleDB实例,我使用boto for Python更新和读取:
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 :(得分:0)
这里的问题是SimpleDB默认最终是一致的。因此,当您编写数据然后立即尝试读取数据时,您无法保证获得最新数据,尽管您可以确保最终数据一致。使用SimpleDB,最终通常意味着不到一秒钟,但无法保证可以花多长时间。
但是,有一种方法可以告诉SimpleDB您希望获得一致的数据视图,并且如果有必要,愿意等待它。您可以通过稍微更改查询代码来执行此操作:
query = 'select * from `DomainName` where key1=val1'
check = domain.select(query, consistent_read=True)
itemName = check.next()['key2']
这应始终返回最新值。