Как блокировать поток на время выполнения SQL запроса



  • Я использую модуль SQL с базой данных mysql. Беру строку из таблицы с минимальной датой. Типа такого:

    SELECT * FROM table ORDER BY update_time ASC LIMIT 1
    

    и затем пишу текущее время:

    UPDATE table SET update_time=[[TIME]] WHERE id=[[ID]]
    

    После апдейта я уверен, что строка повторно возьмется в самом конце (данные в моем кейсе должны браться по кругу).
    Но часто все равно хватает времени, чтобы несколько потоков взяли одну и ту же строку.

    SELECT ... FOR UPDATE
    

    приводит к ошибке таймаута.

    Как блокировать остальные потоки на время выполнения этих двух запросов?



  • @thepappo said in Как блокировать поток на время выполнения SQL запроса:

    Как блокировать остальные потоки на время выполнения этих двух запросов?

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



  • @Fox я видел ваш ответ в соседней ветке и искал полчаса, но что-то так найти и не смог (



  • @thepappo said in Как блокировать поток на время выполнения SQL запроса:

    @Fox я видел ваш ответ в соседней ветке и искал полчаса, но что-то так найти и не смог (

    https://community.bablosoft.com/topic/4672/hello-need-a-little-help/5



  • Спасибо. А отдельные функции нельзя блокировать? Имею в виду, что через глобальную переменную в данной реализации блокируются все остальные потоки независимо от тех действий, которые они выполняют в данный момент. А нельзя ли сделать, чтобы потоки одновременно не выполняли конкретную функцию, а если находятся вне этой функции, то продолжали работу? Я знаю, что вряд ли, но вдруг )



  • @thepappo said in Как блокировать поток на время выполнения SQL запроса:

    Спасибо. А отдельные функции нельзя блокировать? Имею в виду, что через глобальную переменную в данной реализации блокируются все остальные потоки независимо от тех действий, которые они выполняют в данный момент. А нельзя ли сделать, чтобы потоки одновременно не выполняли конкретную функцию, а если находятся вне этой функции, то продолжали работу? Я знаю, что вряд ли, но вдруг )

    Можно. Смотрите тестовый скрипт, там максимально просто всё сделано



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


Log in to reply