Несколько команд атомарно - PullRequest
0 голосов
/ 10 февраля 2011

Я использую PHP и MySQL для вызова пары команд.Существует таблица перекрестных ссылок «группа-сотрудник», и сотрудники могут быть добавлены или удалены из группы.Я пишу эту функцию, сначала удаляя всех сотрудников, а затем добавляя их обратно в каждого сотрудника, который находится в таблице, если группа изменена.Но я хочу убедиться, что все команды пройдены, иначе таблица будет откатана.Как я могу убедиться, что команды выполняются атомарно?

Ответы [ 3 ]

3 голосов
/ 10 февраля 2011

Вы ищете транзакции, если я не ошибаюсь.

Вот отличное место для начала: http://dev.mysql.com/doc/refman/5.0/en/sql-syntax-transactions.html

1 голос
/ 10 февраля 2011

Если вы используете движок MyIsam вместо InnoDB, вы не сможете воспользоваться преимуществами транзакций.В этом случае вам лучше всего выполнить все ваши первые операции INSERTS (ваша таблица перекрестных ссылок должна иметь уникальное ограничение из двух полей, чтобы сбой молча проваливался).Затем выполните одно УДАЛЕНИЕ:

DELETE FROM employees_groups 
WHERE group_id = <groupid> 
AND employee_id NOT IN (list of employee ids you just inserted)
1 голос
/ 10 февраля 2011

Предполагая, что ваши целевые таблицы поддерживают транзакции, вам нужно семейство методов транзакций mysqli.

См:

Если ваши таблицы не поддерживают транзакции, вы, вероятно, можете без проблем изменить типы таблиц на «InnoDB» и, таким образом, поддерживать транзакции. Прежде чем сделать это, сначала обратитесь к администратору БД.

...