Ну это понятно. Нужно чтоб второй процесс ждал пока не окончится первый, для этого и хотел закрывать таблицу. Странно что это так сложно реализовать в InnoDB
Нагрузок вообще нет, просто раз в минуту одновременно разные сервера обычно запускают запрос который обновляет данные в таблице. Получается одновременно с трёх потоков идут запросы: Код (Text): UPDATE video_stats v,video_stats_tmp1 s SET v.views=v.views+s.views WHERE v.video_id = s.video_id; UPDATE video_stats v,video_stats_tmp2 s SET v.views=v.views+s.views WHERE v.video_id = s.video_id; UPDATE video_stats v,video_stats_tmp3 s SET v.views=v.views+s.views WHERE v.video_id = s.video_id; А если и во второй раз упадёт , что тогда? Или вы имеете виду функцию которая вызывает саму себя ? То есть каждый раз падает и заново запускается ?
а в чем разница в запросах? сделайте на каждом сервере перед запросами sleep( rand(5,35) ) и получите размазанный вызовы
В общем есть сервера на которых собираются статистические данные во временных идентичных таблицах. Раз в минуту все сервера переписывают свои таблицы на главный сервер (с помощью sync table) И потом данные всех временных таблиц video_stats_tmp1,video_stats_tmp2,video_stats_tmp3 прибавляются к главной таблице video_stats. То есть разницы в запросах нет, одни и те же запросы, разные таблицы - сложение данных. Ну вообще то я сразу так и сделал, но такое решение меня не удовлетворяет, так как иногда запросы всё равно могут соприкасаться. Насчёт ROLLBACK-ов вы такую конструкцию имели виду ? Код (Text): <?php function transact_query($link,$query){ mysqli_query($link, "SET autocommit=0"); mysqli_query($link, "START TRANSACTION"); mysqli_query($link,$query); if(mysqli_errno($link)==1213){ mysqli_query($link,'ROLLBACK'); sleep(1); transact_query($link,$query); } else { mysqli_query($link, "COMMIT"); return; } } $link = mysqli_connect(LBHOST,LBUSER,LBPASS, LBNAME); transact_query($link,"update stats set status=444 where id=8312"); mysqli_close($link); ?>
PHP: <?php $flag = false; while(!$flag) { // start transaction try { // query // commit $flag = true; } catch (Exception $e) { // rollback // sleep(1) } }