Должен ли я использовать InnoDB для этого? - PullRequest
0 голосов
/ 30 августа 2009

Я занимаюсь разработкой персонального приложения на PHP / MySQL, и я столкнулся с этим конкретным сценарием в моем проекте:

У меня есть различные темы комментариев. Это обрабатывается двумя таблицами - «Комментарии» и «Потоки», причем каждый комментарий в таблице «Комментарии» имеет атрибут «thread_id», указывающий, к какой нити принадлежит комментарий. Когда пользователь удаляет цепочку комментариев, в настоящее время я делаю два отдельных запроса DELETE SQL:

  1. Сначала удалите все комментарии, относящиеся к теме в таблице «Комментарии»
  2. Затем очистите запись потока из таблицы 'Threads'.

У меня также есть другая ситуация, когда мне нужно вставить данные из формы в две отдельные таблицы.

Должен ли я использовать транзакции для подобных ситуаций? Если это так, то является ли общим эмпирическим правилом использование транзакций всякий раз, когда мне нужно выполнить несколько запросов SQL?

Ответы [ 4 ]

1 голос
/ 30 августа 2009

Это зависит от ваших реальных потребностей, транзакции - это просто способ гарантировать, что все манипуляции с данными, которые формируют одну транзакцию, будут выполнены успешно, и что транзакции происходят последовательно (новая транзакция не может быть сделана, пока предыдущая не была либо успешной, либо не удалось). Если по какой-либо причине один из запросов завершится неудачно, произойдет сбой всей транзакции и будет восстановлено предыдущее состояние.

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

0 голосов
/ 30 августа 2009

Для первой части вашего вопроса я бы рекомендовал объявить thread_id в качестве внешнего ключа в вашей таблице комментариев. Это должно ссылаться на столбец id таблицы потоков. Затем вы можете установить «ON DELETE CASCADE», это означает, что при удалении идентификатора из таблицы потоков все комментарии, ссылающиеся на этот идентификатор, также будут удалены.

0 голосов
/ 30 августа 2009

Если вы хотите ACID транзакции, вы хотите InnoDB. Если успешное выполнение одного УДАЛИТЬ, а другой отказ означает ручное УДАЛЕНИЕ неудачной попытки, я бы сказал, что с базой данных лучше справиться. Эти ситуации требуют транзакций.

0 голосов
/ 30 августа 2009

Да, общее правило - использовать транзакции при выполнении нескольких связанных операций. Если вы переключитесь на InnoDB (обычно это хорошая идея, но не всегда. Мы не обсуждали никаких требований, кроме транзакций, поэтому я не буду комментировать больше), я бы также предложил установить ограничение для комментариев, указывающее на потоки. как это звучит, как комментарий должен быть назначен потоку. Удаление потока приведет к удалению связанных комментариев в одном атомарном утверждении.

...