• Вопросы по статьям на хабре и википедии про уровни изоляции транзаций - почему так написано?

    asumin
    @asumin
    /Web/PHP
    Статья на википедии имеет более глубокие исторические корни, она не про то какие сейчас есть клевые СУБД, а о том как они развивались. Т.е. когда-то давно-давно, были простейшие СУБД без транзакций, без изолированности и пользователи при их эксплуатации сталкивались с определенными ошибками: кто-то увидел чужие данные которых не было, кто-увидел фантомные данные, которых больше нет и так далее, в ответ на эти проблемы появлялись более строгие уровни изоляции данных. При этом есть дилемма: чем выше уровень изоляции - тем ниже производительность системы. Т.е. это статья больше о теории хранения данных с совместным доступом, например, с какими проблемами вы столкнетесь, если захотите написать свой транзакционный движок.

    Теперь про потерянное обновление, есть таблица Counter с одной строкой и полем count = 0.
    Транзакция №1
    UPDATE counter SET count = count + 10;
    что в это время делает движок:
    1. читает текущее значение count равное 0
    2. прибавляет к нему 10
    3. но транзакция еще не завершена, и новое значение 10 просто держится в памяти
    В это время стартует Транзакция №2 с тем же самым запросом
    UPDATE counter SET count = count + 10;
    что делает движок? То же самое что и в первый раз:
    1. читает текущее значение count равное 0, потому что первая транзакция еще не завершена, и вторая не видит её результатов <- это и есть уровень изоляции, мы или видим данные в чужой транзакции или нет.
    2. прибавляет к нему 10
    3. завершаем Транзакцию №2 и на диск сохраняется count равное 10.
    После этого подоспела и первая транзакция, она тоже готова сохранить своё вычисленное значение count равное 10 и на диск снова пишется 10, а не 20, как мы ожидали.

    Современные промышленные СУБД такой трюк провести не дадут (строки на время update будут заблокированы), а вот студент, который пишет программу для курсовой работы, может допустить такую не очевидную ошибку.
    Ответ написан
  • Поисковой робот имеет московский ip и индексирует только московскую страницу сайта, как убрать геозависимость только у него?

    asumin
    @asumin
    /Web/PHP
    Во-первых, если на вашем сайте, по одному и тому же URL для разных клиентов (по ip адресу) отдаются разные страницы - это грубая ошибка и поисковики могут даже забанить за такое. Пользователям это тоже создает кучу проблем: внучка из Москвы не сможет передать бабушке в Саратове ссылку на платье, которое она сейчас рассматривает. Следовательно надо сначала это исправить.
    Если же URL уже правильно настроены, например: example.com/spb/index , example.com/msk/index то не вижу никаких проблем:
    1. Можно использовать sitemap https://yandex.ru/support/webmaster/indexing-optio... чтобы сказать роботу что индексировать.
    2. Можно в подвале разместить ссылку "мы в других регионах", которая ведет на страницу со ссылками на все региональные страницы.
    Самое главное, здесь, чтобы проверка ip адреса производилась, только в том случае, если регион еще не указан в URL, если же регион уже указан, то движок не должен его автоматом редиректить на другой регион, может только предложить это.
    Например, я живу в Москве:
    1. когда захожу на example.com меня автоматом перекидывает на example.com/msk
    2. когда захожу на example.com/spb меня никуда автоматом не кидают, но показывают ссылку "хотите перейти на версию для Москвы ?"
    Тогда и с роботами всё будет нормально.
    Ответ написан
    Комментировать
  • SELECT auto_increment при создании копии структуры таблицы?

    asumin
    @asumin
    /Web/PHP
    Создайте хранимую процедурку типа такой:
    DELIMITER $$
    
    CREATE  PROCEDURE `update_autoincrement`( IN tablename VARCHAR(55),  IN ai_value INT )
    LANGUAGE SQL 
    NOT DETERMINISTIC 
    SQL SECURITY INVOKER  
    
    BEGIN
       
       set @sql = concat( 'ALTER TABLE `' , tablename , '` AUTO_INCREMENT = ', ai_value );
       PREPARE stmt FROM @sql;
       EXECUTE stmt ;
    
    END;
    $$
    delimiter ;

    Затем в нужном месте вызываете:
    call update_autoincrement( 'test', 70 );

    приведенный код является примером, он рабочий, но не хватает проверки входных значений на безопасность.
    Ответ написан
  • Как сделать кастомный текст ошибки для констрейнта?

    asumin
    @asumin Автор вопроса
    /Web/PHP
    парсить в приложении текст ошибки для его руссификации вообще очень сомнительная практика
    Ответ написан
  • Используете ли Вы регулярно в своих проектах PEAR ?

    asumin
    @asumin Автор вопроса
    /Web/PHP
    Похоже никто не использует.
    Ответ написан
    Комментировать
  • Используете ли Вы регулярно в своих проектах PEAR ?

    asumin
    @asumin Автор вопроса
    /Web/PHP
    Да анонимный минус — это круто, а написать комент по делу, не каждому дано
    Ответ написан
    Комментировать