2016-12-14 3 views
0

Например, у нас есть таблица (login, hash). У нас нет ограничения unique на столбце входа, но мы должны сохранить его уникальным (например, например). Когда регистрируется новый пользователь, мы проверяем, свободен ли введенный логин. Если это Java-приложение, развернутое в Tomcat, у которого есть пул потоков, тогда эти проверки могут обрабатываться параллельно, правильно? Как обеспечить уникальность тогда?Uniquness check без ограничений DB

ответ

1

Вы можете использовать блокировку пессимиста в таблице, которая заблокирует таблицу, и вы можете проверить, есть ли и сохранить, поэтому другой поток не сможет изменить эту таблицу на этот раз. Но я думаю, что это действительно плохой способ сделать что-то, почему бы не использовать ограничения DB?

1

Одним словом, у вас не может быть хорошего решения без ограничений базы данных.

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

Это будет работать, если все ваши потоки имеют доступ к этому мьютексу, и если будет гарантировано, что никто другой не сможет получить доступ к базе данных одновременно.

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

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

Еще один вариант - блокировка всей таблицы, но это еще хуже. Вам нужно очень надежно освободить замок, иначе вы рискуете затормозить всю систему.

Смежные вопросы