Например, у нас есть таблица (login, hash). У нас нет ограничения unique
на столбце входа, но мы должны сохранить его уникальным (например, например). Когда регистрируется новый пользователь, мы проверяем, свободен ли введенный логин. Если это Java-приложение, развернутое в Tomcat, у которого есть пул потоков, тогда эти проверки могут обрабатываться параллельно, правильно? Как обеспечить уникальность тогда?Uniquness check без ограничений DB
ответ
Вы можете использовать блокировку пессимиста в таблице, которая заблокирует таблицу, и вы можете проверить, есть ли и сохранить, поэтому другой поток не сможет изменить эту таблицу на этот раз. Но я думаю, что это действительно плохой способ сделать что-то, почему бы не использовать ограничения DB?
Одним словом, у вас не может быть хорошего решения без ограничений базы данных.
Без ограничения в многопоточной среде вам понадобится общий ресурс для синхронизации ваших потоков. Нить получит мьютекс, проверьте, свободен ли вход (с использованием SELECT
), а затем INSERT
новая запись, если она была бесплатной. Ни одна другая нить не должна быть в состоянии сделать это одновременно - вот почему вам нужна синхронизация здесь.
Это будет работать, если все ваши потоки имеют доступ к этому мьютексу, и если будет гарантировано, что никто другой не сможет получить доступ к базе данных одновременно.
Первая проблема возникает, если у вас есть, например, несколько машин, которые обращаются к одной базе данных. Нити, работающие на разных машинах, не будут иметь доступа к одному и тому же мьютексу, поэтому они будут счастливо вставлены в вашу таблицу параллельно.
Другая проблема в том, что если кто-то войдет в базу данных и создает записи в этой таблице напрямую, такие вставки могут произойти точно между SELECT и INSERT, выполненными из вашего кода. Поэтому синхронизация в коде не поможет.
Еще один вариант - блокировка всей таблицы, но это еще хуже. Вам нужно очень надежно освободить замок, иначе вы рискуете затормозить всю систему.
- 1. GROUP BY без ограничений на большой DB
- 2. Объединение ограничений UNIQUE и CHECK
- 3. Check MySql DB Connection
- 4. updaing \ save с EF нарушает ограничение Uniquness DB
- 5. php mysql check db first
- 6. Pentaho Kettle-check проверить соединения db без остановки работы
- 7. Без ограничений и без ожидания?
- 8. Check DB ИНТ поле против метки времени
- 9. Иностранный ключ без ограничений?
- 10. MySQL - запуск без ограничений
- 11. C++ Char без ограничений
- 12. textarea бесконечна, без ограничений
- 13. Автоматическая вставка без ограничений
- 14. Без ограничений в Haskell
- 15. XSD подтвердите uniquness дочерних elments
- 16. Email uniquness проверки в JSF
- 17. SSIS CSV и DB Таблица count Check
- 18. Mysql check limit 3 уже в db
- 19. C# check age of db Item
- 20. SQLite Check Constraints и SQLite DB Browser
- 21. ASP.NET MVC Razor Check DB Entry
- 22. Результаты поиска без пейджера и без ограничений
- 23. Выполнение функций Haskell без ограничений
- 24. PaaS/принимал PaaS без ограничений
- 25. Добавление ограничений без автоматического макета
- 26. Ansible-pull без ограничений инвентаря
- 27. GetData from IsolatedStorage без ограничений
- 28. select2 - пометка терминов без ограничений
- 29. атрибутов маршрутизации ограничений без параметров
- 30. Oracle удаляет без ограничения ограничений