table.put(p) コマンドを発行するまで、行はロックされていないと思います。Put p = new Put("row key"); を使用する場合 書き込みに関する情報を保持するオブジェクトを作成していますが、実際にはまだデータベースと通信していません。データベースへの書き込みを試みる準備ができたら、table.put(p) と入力します。2 つの put() 操作が同じ行で同時に発生した場合、そのうちの 1 つが失敗する可能性があります。しかし、ロックは HBase 内で発生し、外部から制御できないため、行ロックを非常に長い間保持することはできないと思います。したがって、プロセスは次のようになります。
- コードは hbase に put を送信します
- hbase は行を内部的にロックします
- hbase はデータを書き込みます
- hbase は行のロックを解除します
つまり、2 人が同じ行に put() を送信しようとすると、成功するのは 1 つだけで、HBase はエラー メッセージをもう一方のクライアントに送信します。
2 つのクライアントが同じ行キーを同時に put() しようとしたとします。
- クライアント 1 が put を送信
- クライアント 2 送信プット
- hbase はクライアント 1 の行をロックします
- 行がロックされているため、hbase はクライアント 2 にエラーを送信します。
- hbase はクライアント 1 のデータを書き込みます
- hbase は行のロックを解除します
前の質問の IP アドレスとログイン時間の例に従うと、誰かが異なる IP アドレスから同時に 2 回ログインした場合、1 つの IP のみがデータベースに書き込まれますが、タイムスタンプは書き込まれた IP と一致します。 .
私はこれを完全には理解していないかもしれませんが、これが私の現在の理解です。お役に立てば幸いです。