解决方法
免责声明:我是Dynamodb-mapper项目的维护者
自动递增键直观的工作流程:
>得到最后的柜台位置
>添加1
>使用新的数字作为对象的索引
>保存新的计数器值
>保存对象
这只是为了解释基本思想.不要这样做,因为它不是原子的.在某些工作负载下,您可以将相同的ID分配给2个不同的对象,因为它不是原子的.这将导致数据丢失.
解决方案是使用原子ADD操作以及ALL_NEW的UpdateItem:
>原子地生成一个ID
>使用新的数字作为对象的索引
>保存对象
在最坏的情况下,应用程序在保存对象之前崩溃,但不会有两次分配相同ID的风险.
还有一个问题:在哪里存储最后的ID值?我们选择了:
{ "hash_key"=-1,#0 was judged too risky as it is the default value for integers. "__max_hash_key__y"=N }
当然,为了可靠地工作,所有插入数据的应用程序都必须意识到这个系统,否则你可能再次覆盖数据.
最后一步是使流程自动化.例如:
When hash_key is 0: atomically_allocate_ID() actual_save()
有关实现细节(Python,对不起),请参阅https://bitbucket.org/Ludia/dynamodb-mapper/src/8173d0e8b55d/dynamodb_mapper/model.py#cl-67
告诉你事实真相,我的公司并没有在生产中使用它,因为大多数时候最好是为用户找到一个ID,一个事务,一个日期时间,…
我在dynamodb-mapper’s documentation中写了一些例子,可以很容易地推断出Node.JS
如果您有任何问题,请随时问.