たとえば、テーブル(ログイン、ハッシュ)があります。ログインコラムにはunique
という制約はありませんが、一意に保つ必要があります。 新しいユーザーが登録すると、入力されたログインが無料であるかどうかがチェックされます。 TomcatにデプロイされたJava Webアプリケーションのスレッドプールがある場合、それらのチェックは並列処理される可能性があります。一意性を保証する方法は?DB制約なしの一意性チェック
0
A
答えて
1
テーブルをロックする悲観的なロックを使用することができます。これにより、テーブルにはhasとsaveがあるかどうかを確認できます。このため、他のスレッドはこのテーブルを変更することができません。しかし、それは物事を行うには本当に悪い方法だと思う、なぜDBの制約を使用しないでください?
1
要するに、ここでデータベースの制約がないと良い解決策を得ることはできません。
マルチスレッド環境では、スレッドを同期させるための共通リソースが必要です。スレッドがミューテックスを取得する場合は、ログインがフリーであるかどうか(SELECT
を使用)を確認し、フリーであればINSERT
新しいレコードを確認します。これを他のスレッドで同時に行うことはできません - これがここで同期が必要な理由です。
これは、すべてのスレッドがこのミューテックスにアクセスできる場合、および他の誰もデータベースに同時にアクセスできないことが保証されている場合に機能します。
たとえば、同じデータベースにアクセスする複数のマシンがある場合、最初の問題が発生します。異なるマシン上で実行されているスレッドは、同じmutexにアクセスすることができないため、テーブルにパラレルに挿入することができます。
誰かがデータベースにログインしてそのテーブルにレコードを直接作成すると、そのような挿入はコードから実行されるSELECTとINSERTの間で正確に発生するという別の問題があります。したがって、コード内の同期はここでは役に立ちません。
さらなるオプションはテーブル全体をロックしていますが、それはさらに悪いことです。あなたは非常に確実にロックを解除する必要があります。さもなければ、システム全体をストールさせる危険があります。
関連する問題
- 1. Railsの一意性制約
- 2. 一意性制約(1)バリュー
- 3. 第3正規形一意性制約
- 4. NodeEntityの一意制約
- 5. sqlの一意制約
- 6. oracle dbの条件付き一意制約
- 7. 複雑な一意性制約をPostgresに置きますか?
- 8. SQLiteチェック制約とSQLite DBブラウザ
- 9. SQL制約:一意でない列の一意の値
- 10. 一意制約例外(SQLIntegrityConstraintViolationException)
- 11. Symfony 3一意制約エラー
- 12. 一意性制約違反を確認してください
- 13. Oracleチェック制約列がゼロまたは一意である
- 14. Cypher:一意性制約上の特定の値を返すvoilation
- 15. SQL DDL - 2属性のチェック制約
- 16. SpringデータNeo4j 4.xの一意性制約?
- 17. Oracleの一意性制約 - 小文字混合
- 18. JPAコレクションにマッピングテーブルの一意性制約がありません
- 19. 制約のチェック
- 20. Authlogic:一意性制約を無効にする
- 21. Ectoで一意性制約をテストする方法
- 22. 条件付き一意性制約Ruby on rails
- 23. Play Framework [1.2.4]:エンティティの一意の制約
- 24. SQLサーバー:一意の制約の説明
- 25. 2列の一意制約の作成
- 26. 異なる表の列に対する複数列の一意性制約
- 27. MySQLテーブルの一意制約を破棄
- 28. CodeIgniterのORA-00001:一意制約
- 29. 一意の制約違反 - デバッグ
- 30. コアデータデフォルト値以外の一意制約