我认为没有解决此问题的“廉价”解决方案。在多用户环境中唯一安全(但不一定快速)的解决方案是拥有一个“计数器”表,每个客户一行。
每笔交易都必须先锁定客户的条目,然后再插入新票证,如下所示:
UPDATE cust_numbers SET current_number = current_number + 1WHERe cust_id = 42RETURNING current_number;
一步就能完成三件事
- 增加该客户的当前“顺序”号
- 锁定该行,因此执行相同 *** 作的其他事务将不得不等待锁定
- 返回该列的新值。
使用该新号码,您现在可以插入新票证。如果提交了事务,它还将释放对
cust_numbers表的锁定,因此其他“等待号码”的事务可以继续进行。
您可以将两个步骤(更新..返回和插入)包装到单个存储的函数中,以便集中进行此 *** 作后的逻辑。您的应用程序只会在
selectinsert_ticket(...)不知道票证号码如何生成的情况下进行调用。
您可能还想在客户表上创建一个触发器,以便在创建
cust_numbers新客户时自动在表中插入一行。
这样做的缺点是,您可以有效地序列化为同一客户插入新票证的交易。根据系统中插入内容的数量,这可能会成为性能问题。
编辑这样做的
另一个缺点是,您不会 被迫 以这种方式插入票证,如果新开发者忘记了此票证,可能会导致问题。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)