За последние 24 часа нас посетили 30767 программистов и 1481 робот. Сейчас ищут 902 программиста ...

Правильное выполнение транзакций

Тема в разделе "PHP и базы данных", создана пользователем eldor, 24 янв 2016.

  1. eldor

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

    С нами с:
    3 май 2013
    Сообщения:
    202
    Симпатии:
    20
    Есть след. код:

    Код (PHP):
    1. //Отмена автоматического подтверждения выполнения SQL запросов в базе данных (отключение режима фиксации).
    2. mysqli_autocommit($db, FALSE);
    3. ...
    4. //Разные запросы.
    5. ...
    6. //Подтверждение выполнения транзакции.
    7. //Включение автоматического подтверждения выполнения SQL запросов в базе данных.
    8. mysqli_autocommit($db, TRUE);
    9. ...
    10. //Разные запросы.
    11. ...
    12.  
    Правильная ли работа с транзакциями?
     
  2. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
  3. eldor

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

    С нами с:
    3 май 2013
    Сообщения:
    202
    Симпатии:
    20
    Да, rollback не указал. Он подключается к каждому запросу в транзакции и выводится, если запрос обработан неправильно. Тип таблиц InnoDB.

    А в общем схема правильная?
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    просто посылай сначала START TRANSACTION или как-то так, а потом комманды COMMIT или ROLLBACK.
     
  5. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    В виде запросов их посылать не правильно нонче. Посылать их надобно в виде функций специальных, в доках прописанных. Равно как и функциями надлежит выставлять кодировку.
     
  6. eldor

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

    С нами с:
    3 май 2013
    Сообщения:
    202
    Симпатии:
    20
    А еще вопрос. Когда транзакции целесообразно использовать, а когда - нет?
     
  7. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Когда тебе нужна гарантия, что твой запрос будет выполнен без ошибок и сбоев - используй транзакцию. Когда нужно выполнить либо несколько связных запросов одним пакетом, либо ни один из них (если выполнится только половина, а потом сервер упадет из-за отключки электричества, сломается логика данных, например), используй транзакцию. Ну и грамотно надо пользоваться коммитами и роллбеками.

    Нужно тебе 10 запросов выполнить пачкой - начни транзакцию. Если ошибок нет, подтверждай, и тогда изменения запечатлятся в БД. Если какой-то сбой - роллбек. И типа ничего и не было.
     
  8. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв
    eldor там где гонка есть, например списание денег, могут быстро запустить страницу которая списывает деньги за покупку например 3 раза и без транзакции может списаться больше чем есть на счёте и ты этого не увидишь
     
  9. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Такие проблемы, имхо, надо решать на уровне ПХП. Лишние запросы просто не должны доходить до бд. "Желтый" флаг, что запрос отправлен, должен проставляться где-то в сессии до работы БД. И последующие запросы должны об этот флаг разбиваться. А там, либо он превратится в "зеленый", и юзеру будет сказано, что все ок, либо красный, юзеру будет сказано, что был феил.

    Доводить гонку до БД - нецелесообразно.
     
  10. eldor

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

    С нами с:
    3 май 2013
    Сообщения:
    202
    Симпатии:
    20
    При работе транзакции для нескольких запросов доступ извне ограничивается только для записей, которые затрагивают запросы в транзакции или ко всем таблицам, которые находятся в запросах внутри транзакции?