如何安全地将递增ID分配给对象的子集?

时间:2011-11-30 03:42:15

标签: ruby-on-rails database

我有一个Order对象,可以处于无薪或付费状态。付款订单时,我想设置一个order_number,它应该是一个递增的数字。

听起来很容易,但我很担心碰撞。我可以想象一个订单有order_number存储在内存中,即将保存,然后另一个订单保存自己,使用该数字,现在应该重新计算内存中的那个,但是如何?

2 个答案:

答案 0 :(得分:0)

您可以创建一个仅包含AUTO_INCREMENT主键的数据库表。当您需要获取新的order_number时,只需在此表中插入并获取创建的行的主键值。

答案 1 :(得分:0)

有很多方法。基本上你需要一个锁来确保每个对计数器的请求总是返回一个不同的值。

Memcache,Redis和一些键值存储具有这种计数器功能。例如,每次想要获得新的order_number时,只需调用Redis的incr命令,它将递增计数器并返回新值。

可以通过RMDBS的触发/存储过程/序列功能(如mysql)实现更复杂的解决方案。对于mysql,创建一个包含AUTO_INCREMENT主键的新表。如果您想获得新的order_number,请在此表格中插入并获取last_insert_id()。如果你想要ACID,只需将程序包装在一个交易中。