在Boto中进行持续更改

时间:2012-04-05 04:57:26

标签: python amazon-simpledb 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_atributes发信号通知数据库进行写入这一事实,但不会等到这个更改持久化。我还尝试使用创建项目然后保存该项目(item.save())而没有太大成功。有谁知道如何在继续下一步操作之前确保已在SimpleDB实例中写入值?

感谢。

1 个答案:

答案 0 :(得分:0)

这里的问题是SimpleDB默认最终是一致的。因此,当您编写数据然后立即尝试读取数据时,您无法保证获得最新数据,尽管您可以确保最终数据一致。使用SimpleDB,最终通常意味着不到一秒钟,但无法保证可以花多长时间。

但是,有一种方法可以告诉SimpleDB您希望获得一致的数据视图,并且如果有必要,愿意等待它。您可以通过稍微更改查询代码来执行此操作:

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

这应始终返回最新值。