2016-12-14 8 views
0

たとえば、テーブル(ログイン、ハッシュ)があります。ログインコラムにはuniqueという制約はありませんが、一意に保つ必要があります。 新しいユーザーが登録すると、入力されたログインが無料であるかどうかがチェックされます。 TomcatにデプロイされたJava Webアプリケーションのスレッドプールがある場合、それらのチェックは並列処理される可能性があります。一意性を保証する方法は?DB制約なしの一意性チェック

答えて

1

テーブルをロックする悲観的なロックを使用することができます。これにより、テーブルにはhasとsaveがあるかどうかを確認できます。このため、他のスレッドはこのテーブルを変更することができません。しかし、それは物事を行うには本当に悪い方法だと思う、なぜDBの制約を使用しないでください?

1

要するに、ここでデータベースの制約がないと良い解決策を得ることはできません。

マルチスレッド環境では、スレッドを同期させるための共通リソースが必要です。スレッドがミューテックスを取得する場合は、ログインがフリーであるかどうか(SELECTを使用)を確認し、フリーであればINSERT新しいレコードを確認します。これを他のスレッドで同時に行うことはできません - これがここで同期が必要な理由です。

これは、すべてのスレッドがこのミューテックスにアクセスできる場合、および他の誰もデータベースに同時にアクセスできないことが保証されている場合に機能します。

たとえば、同じデータベースにアクセスする複数のマシンがある場合、最初の問題が発生します。異なるマシン上で実行されているスレッドは、同じmutexにアクセスすることができないため、テーブルにパラレルに挿入することができます。

誰かがデータベースにログインしてそのテーブルにレコードを直接作成すると、そのような挿入はコードから実行されるSELECTとINSERTの間で正確に発生するという別の問題があります。したがって、コード内の同期はここでは役に立ちません。

さらなるオプションはテーブル全体をロックしていますが、それはさらに悪いことです。あなたは非常に確実にロックを解除する必要があります。さもなければ、システム全体をストールさせる危険があります。

関連する問題