2

HBase では、単一行トランザクションのサポートを提供するために、Row Locking Concept を使用します。たとえば、

Put p=new Put("/*Row Key*/");このステートメントは行をロックします。

そのため、完了するまで

table.put(p)

ロックが解除されません。

そのため、その間に新しいプットを開始すると、つまり

Put p1=new Put("/行キー");

行はすでにロックされているため、p1 put は機能しないはずですが、試してみると HBase 0.94 で機能していました。

Row Lockリンクについて Row Lock について見たところで、私の理解に何か問題がありますか。そうでない場合、行ロックなしで単一行トランザクションのサポートがどのように機能するか。

4

2 に答える 2

3

HBase が機能する方法は、行がアトミック ブロックに書き込まれることを確認するために Put が適用されるときに (クライアントではなく) リージョン サーバーにロックが保持されることですが、スナップショット分離は提供されません(必要な場合はomidなどを使用する必要があります)あなたはあれが欲しい)。

2 つの put が同じクライアントから送信されていないと仮定すると (この場合、それらは同じトランザクションの一部である可能性があります)、HBase がクラッシュしたり、put 間のどこかでタイムアウトが発生したりしない限り (たとえば、圧縮のため)。2 つのプットは、到着した順序に応じて、HBase に順次適用されます。

于 2013-02-16T22:56:20.253 に答える
1

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 と一致します。 .

私はこれを完全には理解していないかもしれませんが、これが私の現在の理解です。お役に立てば幸いです。

于 2013-02-16T07:24:06.137 に答える