Создание уникальных последовательных номеров банковских счетов без блокировки и условий гонки

#mysql #stored-procedures #deadlock

Вопрос:

Мне нужно создать уникальный номер учетной записи для пользователей, регистрирующихся в моем веб-приложении. Номер учетной записи будет создан путем увеличения числа

 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 пользователей.

Есть ли лучшее решение для этого? Номер счета не может быть случайным сгенерированным числом и должен быть увеличен.

Комментарии:

1. Позвольте базе данных сделать это, например, используйте AUTO_INCREMENT

2. Да, моя идея тоже, смотри: w3schools.com/sql/sql_autoincrement.asp

3. @LarsStegelitzThanks. Но смогу ли я достичь 00000001, 00000002 с помощью автоматического увеличения?

4. Да, ты это сделаешь. возможно, вам придется добавить нули спереди, когда это необходимо, но да.

5. @KIKOSoftwareThanks.

Ответ №1:

Все вместе:

  • Позвольте базе данных управлять последовательностью с помощью AUTO_INCREMENT
  • Используйте LPAD для заполнения нулями. Пример с 1 : LPAD(‘1’, 10, ‘0’) = 0000000001
  • Введите новый номер учетной записи в поле VARCHAR

Чтобы облегчить поиск, введите ИНДЕКС в поле номер счета.