【发布时间】:2013-11-13 13:08:15
【问题描述】:
我有一个查询,每次用户购买时都会从receipts 表中获取当前最高的receipt_counter 号码,以便创建新收据。 receipt_counter 在表中不是唯一的,因为它每年都会重置。
receipt_counter 只是一个整数,用于生成类似于"pos_id"-"receipt_counter" 的receipt_label。
人们有可能在同一个销售点同时购买产品 (pos_id)。
获得新的receipt_counter 的函数如下所示:
SELECT (MAX(receipt_counter) + 1) as next_receipt_counter FROM receipts
问题是当多人同时购买产品时,会触发生成新收据(连同收据编号),有时会发生冲突(多人获得相同的收据编号),因为在检索收据计数器和插入之间存在一些延迟新收据进入数据库。
是否有处理此类问题的最佳实践?我是否需要使用某种死锁,还是我最初的想法有缺陷,我需要改变策略来一起生成收据计数器?
编辑:receipt_counter 需要是一个没有间隙的序列号。
【问题讨论】:
-
你不能使用序列来生成
receipt_counter吗? -
如果延迟很低,您可以使用 LOCK TABLE。然后其他用户脚本将等到您解锁该表,即。订单将被写入您的数据库。
-
不要尝试自己实现序列生成器,让数据库来做吧。见Lolo:s answer。
标签: php mysql sql deadlock database-deadlocks