0

我有一个 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 实例?

谢谢。

4

1 回答 1

0

这里的问题是 SimpleDB 默认情况下最终是一致的。因此,当您写入数据然后立即尝试读取它时,虽然您可以保证最终数据将保持一致,但您无法保证获得最新数据。使用 SimpleDB,最终通常意味着不到一秒,但无法保证这可能需要多长时间。

但是,有一种方法可以告诉 SimpleDB 您想要一个一致的数据视图并且愿意等待,如果有必要的话。您可以通过稍微更改查询代码来做到这一点:

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

这应该总是返回最新的值。

于 2012-04-05T13:35:14.150 回答