【问题标题】:Creating unique sequential bank account numbers without dead lock and race condition创建没有死锁和竞争条件的唯一顺序银行帐号
【发布时间】:2021-09-09 07:37:42
【问题描述】:

我需要为在我的 Web 应用程序上注册的用户创建一个唯一的帐号。帐号将通过递增数字来创建

user 1 - 9898000000001
user 2 - 9898000000002
...

我在 MySQL 数据库中有以下存储过程

consider bank_id as '9898' below.

BEGIN
  Set @initialComId = '0000001';
  Set @table_value = null;
  Set @t = null;
SELECT max(company_va) into @table_value FROM virtual_account_numbers
IF ((@table_value) is null and bank_id =1) then
Set @newComId = CONCAT(bank_id,'000001');
INSERT INTO virtual_account_numbers (company_va,partner_banks_id)VALUES (@newComId,bank_id);
SELECT company_va from virtual_account_numbers ORDER BY virtual_account_numbers_id DESC LIMIT 1;                         
END

使用上面的存储过程,如果有10个用户同时注册,我就会陷入死锁。

有没有更好的解决方案?帐号不能是随机生成的数字,应该是递增的。

【问题讨论】:

  • 让数据库来做,例如。使用 AUTO_INCREMENT
  • 是的,我的想法也是如此,请参阅:w3schools.com/sql/sql_autoincrement.asp
  • @LarsStegelitz 谢谢。但是我可以使用自动增量实现 00000001、00000002 吗?
  • 是的,你会的。如果需要,您可能必须在前面添加零,但是可以。
  • @KIKOSoftwareThanks.

标签: mysql stored-procedures deadlock


【解决方案1】:

大家一起:

  • 让数据库通过 AUTO_INCREMENT 管理序列
  • 使用 LPAD 填充零。 1 示例:LPAD('1', 10, '0') = 0000000001
  • 将新帐号写入 VARCHAR 字段

为帮助搜索,请在帐号字段中添加索引。

【讨论】:

    猜你喜欢
    • 2012-10-27
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 2014-11-08
    • 1970-01-01
    • 2019-02-15
    • 2012-04-17
    • 1970-01-01
    相关资源
    最近更新 更多