【发布时间】:2015-10-13 10:32:53
【问题描述】:
我们在设计一个订单管理系统,订单id用Postgresql设计成bigint,place结构实现如下:
以2015072201000010001为例,这里前八位为日期,这里为20150722,后七位为区域码,这里为0100001,后四位为序号在上述地区和日期下。
所以每次创建新订单,php逻辑应用层都会用如下like sql语句查询PostgreSQL:
select id from orders where id between 2015072201000010000 and 2015072201000019999 order by id desc limit 1 offset 0
然后为新订单增加 id,然后将订单插入 PostgreSQL 数据库。
如果一次只有一个订单生成过程,这是可以的。但是由于PostgreSQL的数据库读/写锁机制,在数百个并发订单生成请求的情况下,订单id发生冲突的可能性很大。
假设有两个订单请求A和B。A尝试从数据库中读取最新的订单id,然后B也读取最新的订单id,然后A写入数据库,最后B写入数据库将由于订单 id 主键冲突而失败。
关于如何使这个订单生成操作同时可行有什么想法吗?
【问题讨论】:
标签: php sql database postgresql concurrent-programming