parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

параллельные миры | почему неправильно select,if,insert | transactions

Александр Петросян (PAF) 05.02.2003 10:09 / 05.02.2003 10:12

никогда не забывайте о параллельных запросах.

ваша проверка не унарна, посему на базах данных, не поддерживающих транзакций[в mysql драйвер пока нет поддержки транзакций, которые есть в типах таблиц не по-умолчанию, например, BerkleyDB&InnoDB], она может работать неправильно.

по закону Мерфи, это случится тогда, когда на вашу работу будет смотреть клиент.

подумайте:

два человека одновременно регистрируются в системе:
оба одновременно выполняют запрос select, который говорит обоим «0 ребята, пользователя такого нет», после чего они дружно добавляют… одноимённого.

диагноз:

в данном случае:
используйте unique index на это поле. и смело делайте insert. кто-то сделает insert раньше (все базы данных это гарантируют), второму выдастся ошибка, перехватите её, и сообщите о проблеме пользователю.

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

в базах данных, где транзакции поддерживаются:
подобный код будет работать, поскольку в parser ^connect это одна транзакция, которую parser commit'ит, если {в коде внутри connect} не произошло необработанной ошибки. была ошибка?: транзакция rolled back.

не более, чем «будет работать», менее некрасивой она от этого не становится :)