Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > mod_perl2 DBD::MySQL STOP


Автор: gcc 7.9.2009, 13:01
MyISAM

1) если есть на странице несколько SQL запросов не оптимизированных, INSERT UPDATE, и если пользователь нажмет кпонку STOP в браузере, то возможно что часть SQL запросов не выполниться? 

вот есть ссылка, но я пишу в catalyst и не понял что мне нужно добавить?
http://www.yaldex.com/perl-tutorial-3/0596002270_pmodperl-chp-6-sect-9.html

(как тут сделать обязательно ли форкать?)


2) вот эти запросы, возможно там можно как-то оптимизировать, но что-то не понимаю...
(оптимизировать delete можно в один запрос, но там где идет SELECT и UNION и DELETE - я не знаю как там сделать)
(сайт не нагруженный, сильную оптимизацию я не рассматиривал, она мне не нужна)

например:
Код


  my $sql_all = 'SELECT id_se
                              FROM section
                            WHERE id_un = '.$args[0];

     my $sth2 = $dbh->prepare($sql_all);
        $sth2->execute();  
        
        
    while ( my $id = $sth2->fetchrow_arrayref() ) {    

        my $sql_par = 'SELECT id_se
                              FROM section
                            WHERE
                    parent_se_id = '.$args[0].'
                      
                    UNION
                      
                    SELECT t1.id_se
                    FROM
                    section t1 JOIN section t2
             ON t1.parent_se_id = t2.id_se
                    WHERE
              t2.parent_se_id = '.$args[0];
        
     my $sth = $dbh->prepare($sql_par);
        $sth->execute();          
            
            while ( my $id = $sth->fetchrow_arrayref() ) {    
    
       
             $dbh->do( 'DELETE from section                         
                     WHERE id_se = '.$id->[0],
                 undef, undef );        
       
             $dbh->do( 'DELETE from comment                         
                     WHERE id_se = '.$id->[0],
                 undef, undef );
                 
             $dbh->do( 'DELETE from content                         
                     WHERE id_se = '.$id->[0],
                 undef, undef );                        
       
                }
                
           $sth->finish(); 
         

    }
         $sth2->finish(); 


            $dbh->do(
                qq{DELETE FROM  users                         
                      WHERE id = ? },
                undef, $args[0]
            );

            $dbh->do(
                qq{DELETE FROM  user_roles                        
                      WHERE user_id = ? },
                undef, $args[0]
            );

            $dbh->do(
                qq{DELETE FROM  content                         
                      WHERE id_un = ? },
                undef, $args[0]
            );

            $dbh->do(
                qq{DELETE FROM  comment                         
                      WHERE id_un = ? },
                undef, $args[0]
            );

            $dbh->do(
                qq{DELETE FROM  section                         
                      WHERE id_un = ? },
                undef, $args[0]
            );







мне в прошлый раз исправили:
(но тут другое по легче)

Код

                   'SELECT  dfgdg
                              FROM section
                            WHERE    id_se = ?
                            LIMIT 1';
                SELECT id_se
                              FROM section
                            WHERE
                    parent_se_id = ?
                      
                    UNION
                      
                    SELECT t1.id_se
                    FROM
                    section t1 JOIN section t2
             ON t1.parent_se_id = t2.id_se
                    WHERE
              t2.parent_se_id = ?

           # перебор всего, более 100 значение
            while ( ) {    

            'UPDATE section
                  SET '.$args[1].' = '.$section->[0].' 
                WHERE id_se = '.$email->[0]  , undef, undef );       
               } 


на

Код

UPDATE section AS t4 LEFT JOIN section t2 ON t4.parent_se_id = t2.id_se
SET t4.active_se = 1 - t4.active_se
WHERE t2.parent_se_id = 54 or t4.parent_se_id = 54 



 

Автор: sir_nuf_nuf 7.9.2009, 16:12
InnoDB & transactions ? (это правильное решение)

Кстати а вы не разбирались как собственно юзер может остановить скрипт ?
Ну нажимает он стоп, ну закрывается соединение с сервером и ?
Пока сервер не начнет писать в закрытый сокет он по идее и не должен узнать о том, что соединение закрыто.

Как вариант - делайте вывод данных в конце (у вас ведь шаблонизатор ?) - тогда запросы отработают (должны) не зависимо от соединения.

P.S. это все измыщления. Если вы проверите их - будет круто.

Автор: gcc 8.9.2009, 10:50
1) я почему-то выбрал MyISAM из самого начала, если переходить на innoDB там в приципе не очень много изменить для transactions и еще внешние ключи referens которые сами все решат...

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

говорят что innoDB грузит сервер как только более  2Гб таблица занимает (я с этим не сталкивался, но у меня MyISAM есть 1.5Гб)

2) я вот где-то видел, что mod_perl и FastCGI запускают все скрипты форкая... выполнятся в любом случае

в общем ладно пускай как есть...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)