Уникальные номера

vasdm

Guest
Уникальные номера

Здравствуйте!

У меня следующая задача:
- есть система по выплате зарплаты сотрудникам;
- у сотрудника есть свой счет, на который каждую неделю начисляется некоторая сумма;
- необходимо реализовать процесс вывода определенной суммы (по запросу сотрудника) со счета сотрудника;
- все операции проходят через систему посредника;
- посреднику для каждой транзакции нужен уникальный номер от данной системы.

Как это было раньше:
- следующий номер транзакции, который будет выдан по очередному запросу сотрудника, хранился в отдельной ячейке БД;
- когда поступает запрос на вывод денег:
из описанной выше ячейки вынимается номер очередной транзакции, значение ячейки увеличивается на единицу;
- выполняется запрос к посреднику с передачей этого НТ (номера транзакции), в результате успешного перевода денег
в историю записывается номер транзакции, сумма, ид. сотрудника, ...

При работе бывает ситуация когда двум пользователям по запросу дается один и тот же номер транзакции.


Подскажите, пожалуйста, как можно решить мою проблему другим способом.
 

bakh

Абалдуй
uniqid, mktime, rand

Да и вообще... В базах для этого дела существуют генераторы (interbase), сиквенсы (oracle), автоинкременты (MySQL) и много всякого другого...
 

tony2001

TeaM PHPClub
>При работе бывает ситуация когда двум пользователям по запросу дается один и тот же номер транзакции.
база какая?
 

bakh

Абалдуй
vasdm См. выше мой отредактированный первый ответ...
 

vasdm

Guest
MySQL

можно вначале пользоваться автоинкрементом, но не нужно создавать запись в истории, если перевод денег не осуществиться,

да и вообще посредник должен вернуть еще некоторые данные которые нужно будет поместить в новосозданную запись ....
будет ли рационально:
1. создать вначале пустую запись (для получения номера) - один запрос.
2. узнать этот номер - второй запрос.
выполнить обращение к посреднику
3. занести полученные данные или удалить записи (в случае неудачи) - третий запрос.
Будет ли это рационально ?? (3 запроса - можно ли так делать?)
 

bakh

Абалдуй
vasdm А чому нет?.. 8-О
Нормальная технология... У меня так вообще в несколько приёмов делается: приём накладной, передача её на склад, приём товара складом, приём товара аптекой от склада, продажа товара, списание товара... :)
Ы?.. :)
 

vasdm

Guest
а вдруг ошибка с бд на определенном шаге будет?
 

tony2001

TeaM PHPClub
>MySQL
использовать тип таблиц InnoDB, который поддерживает транзакции.
 

bakh

Абалдуй
Какая ещё ошибка? 8-О
Генерация id средствами базы - всегда корректнее, чем попытка сделать это ручонками...
Тем более, что на таких операциях и ошибок-то быть не может...
Единственно, что не удаляй физически (человеческий фактор ;)), а просто помечай удалёнными...
 

vasdm

Guest
Originally posted by tony2001
>MySQL
использовать тип таблиц InnoDB, который поддерживает транзакции.
О! это уже ближе к правде :)
не можете подсказать, какую-нибудь документацию по тому как осуществлять транзакции в MySQL
и еще: можно ли в MySQL при создании таблиц в некоторых полях указывать REFERENCES от других полей таблиц?
 
Сверху