За последние 24 часа нас посетили 19214 программистов и 1621 робот. Сейчас ищут 1058 программистов ...

Deadlock found when trying to get lock

Тема в разделе "MySQL", создана пользователем evgeny12000, 22 фев 2010.

  1. evgeny12000

    evgeny12000 Активный пользователь

    С нами с:
    22 фев 2010
    Сообщения:
    22
    Симпатии:
    0
    Ну это понятно. Нужно чтоб второй процесс ждал пока не окончится первый, для этого и хотел закрывать таблицу.
    Странно что это так сложно реализовать в InnoDB
     
  2. evgeny12000

    evgeny12000 Активный пользователь

    С нами с:
    22 фев 2010
    Сообщения:
    22
    Симпатии:
    0
    Нагрузок вообще нет, просто раз в минуту одновременно разные сервера обычно запускают запрос который обновляет данные в таблице.

    Получается одновременно с трёх потоков идут запросы:
    Код (Text):
    1.  
    2.  UPDATE video_stats v,video_stats_tmp1 s
    3.        SET v.views=v.views+s.views
    4.        WHERE v.video_id = s.video_id;
    5.  
    6.  UPDATE video_stats v,video_stats_tmp2 s
    7.        SET v.views=v.views+s.views
    8.        WHERE v.video_id = s.video_id;
    9.  
    10.  UPDATE video_stats v,video_stats_tmp3 s
    11.        SET v.views=v.views+s.views
    12.        WHERE v.video_id = s.video_id;

    А если и во второй раз упадёт , что тогда?
    Или вы имеете виду функцию которая вызывает саму себя ? То есть каждый раз падает и заново запускается ?
     
  3. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда
    а в чем разница в запросах?

    сделайте на каждом сервере перед запросами

    sleep( rand(5,35) ) и получите размазанный вызовы
     
  4. evgeny12000

    evgeny12000 Активный пользователь

    С нами с:
    22 фев 2010
    Сообщения:
    22
    Симпатии:
    0
    В общем есть сервера на которых собираются статистические данные во временных идентичных таблицах.
    Раз в минуту все сервера переписывают свои таблицы на главный сервер (с помощью sync table)
    И потом данные всех временных таблиц video_stats_tmp1,video_stats_tmp2,video_stats_tmp3 прибавляются к главной таблице video_stats.
    То есть разницы в запросах нет, одни и те же запросы, разные таблицы - сложение данных.

    Ну вообще то я сразу так и сделал, но такое решение меня не удовлетворяет, так как иногда запросы всё равно могут соприкасаться.

    Насчёт ROLLBACK-ов вы такую конструкцию имели виду ?

    Код (Text):
    1. <?php
    2.  
    3. function transact_query($link,$query){
    4.      mysqli_query($link, "SET autocommit=0");
    5.      mysqli_query($link, "START TRANSACTION");
    6.      mysqli_query($link,$query);
    7.      if(mysqli_errno($link)==1213){
    8.         mysqli_query($link,'ROLLBACK');
    9.         sleep(1);
    10.         transact_query($link,$query);
    11.      }
    12.      else {
    13.         mysqli_query($link, "COMMIT");
    14.         return;
    15.      }
    16. }
    17.  
    18. $link = mysqli_connect(LBHOST,LBUSER,LBPASS, LBNAME);
    19. transact_query($link,"update stats set status=444 where id=8312");
    20. mysqli_close($link);
    21.  
    22. ?>
     
  5. Simpliest

    Simpliest Активный пользователь

    С нами с:
    24 сен 2009
    Сообщения:
    4.511
    Симпатии:
    2
    Адрес:
    Донецк
    PHP:
    1. <?php
    2. $flag = false;
    3. while(!$flag) {
    4.     // start transaction
    5.     try {
    6.         // query
    7.         // commit
    8.         $flag = true;
    9.     } catch (Exception $e) {
    10.         // rollback
    11.         // sleep(1)
    12.     }
    13. }
     
  6. 440Hz

    440Hz Старожил
    Команда форума Модератор

    С нами с:
    21 дек 2012
    Сообщения:
    8.003
    Симпатии:
    1
    Адрес:
    Оттуда

    ну да, тока можно без sleep ну или nanosleep()