параллельные миры | почему неправильно 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.
не более, чем «будет работать», менее некрасивой она от этого не становится :)
- Ничего не понимаю... ;(, e-ploko 05.02.2003 08:13
- параллельные миры | почему неправильно select,if,insert | transactions, Александр Петросян (PAF) [M] 05.02.2003 10:09 / 05.02.2003 10:12
- попробуйте без count, egr 05.02.2003 08:47 / 05.02.2003 08:47