Проблема с перезаписью данных через Базу



  • Осваивать базу начал недавно, до этого все проекты по старинке через файлы делал. И столкнулся с аномалией.
    Имеется таблица, в ней есть колонка int в которой я указываю сколько еще раз можно использовать эту запись.

    Эта таблица считывается через ресурсы, далее распарс на переменные. После, через действие Изменить запись меняю данные у этой записи, а именно делаю -1 для int колонки. Что бы в итоге через время значение стало 0 и удалилось из базы.
    Но это не работает так как должно работать. Значение уменьшается на одну единицу ровно 1 раз после того как отработает первая партия потоков.

    0_1497124604538_upload-21ce9f29-1a0e-4754-a772-2ad64ede4c2b

    Поток 1 - считал значение 13, буду ставить 12. установил 12
    Поток 2 - считал значение 10, буду ставить 9. установил 9
    Поток 3 - считал значение 5, буду ставить 4. установил 4
    потоки перезапускаются 1й раз
    Поток 1 - считал значение 12, буду ставить 11. установил 12
    Поток 2 - считал значение 9, буду ставить 8. установил 9
    Поток 3 - считал значение 4, буду ставить 3. установил 4
    потоки перезапускаются 2й раз
    Поток 1 - считал значение 12, буду ставить 11. установил 12
    Поток 2 - считал значение 9, буду ставить 8. установил 9
    Поток 3 - считал значение 4, буду ставить 3. установил 4

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



  • Эту проблему решил вот этой опцией
    0_1497348517777_upload-c49bb677-347a-40c4-b270-3e0ea09766b1
    С перезаписью с удалением в файл она работала не корректно (были дубли), а в базе все работает правильно.

    Новый вопрос. Во время старта работы в базе 100 записей. Соответственно цикл стартует на 100 итераций и каждый поток берет только уникальную строку из базы, по ходу работы строки удаляются и потокам не хватает своей уникальной строки и они её ждут бесконечно. Как максимально просто пофиксить?
    Считывать всю базу в список не круто, теряется нужный функционал и зачем тогда вообще нужно было на базу переходить)



  • @venom777 А разве можно как то по другому узнать количество записей в базе, кроме как получить записи >> количество элементов ?



  • @Fox вот я и не знаю, нужно как-то проверить наличие записей которые можно использовать перед тем как выполнять действие с получением записи через ресурс.

    Может для этого есть какой-то api у баса, или ограничить время на ожидание строки.



  • @venom777

    И столкнулся с аномалией.

    При работе с ресурсами строки из базы сохраняются в памяти и они не изменяются при изменении значений в базе. Поэтому получается такой эффект.

    В вашем случае я бы рекомендовал использовать запросы(они получают актуальные значения), либо вместо числовой колонки использовать максимальное количество успешных использований у ресурса.



  • @support Вопрос Как то можно ещё получить количество записей в базе, кроме как получить записи >> количество элементов ?



  • @Fox Пока только так(


Log in to reply
 

  • 6
  • 2
  • 1
  • 2
  • 4
  • 24
  • 15
  • 4