在Boto中持久化更改



我有一个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']

这应该始终返回最新的值。

相关内容

  • 没有找到相关文章

最新更新