我有一个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_attributes向数据库发出写入信号,但不会等到这种更改持续存在。我还尝试过创建一个项目,然后保存该项目(item.save()),但没有成功。有人知道在进行下一步操作之前,我如何确保在SimpleDB实例中写入了值吗?
谢谢。
这里的问题是SimpleDB在默认情况下最终是一致的。因此,当您写入数据,然后立即尝试读取数据时,不能保证获得最新的数据,尽管可以保证最终数据是一致的。对于SimpleDB,最终通常意味着不到一秒钟,但无法保证需要多长时间。
然而,有一种方法可以告诉SimpleDB,您想要一个一致的数据视图,并愿意在必要时等待它。您可以通过稍微更改查询代码来做到这一点:
query = 'select * from `DomainName` where key1=val1'
check = domain.select(query, consistent_read=True)
itemName = check.next()['key2']
这应该始终返回最新的值。