#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
Чтобы облегчить поиск, введите ИНДЕКС в поле номер счета.