2013-02-16 35 views
1

在HBase中,爲了提供單行事務支持,它使用行鎖定概念。假設,例如行鎖定HBase單行事務支持

Put p=new Put("/*Row Key*/");該語句將鎖定該行。

所以,直到我們完成

table.put(P)

鎖不會被釋放。

所以,如果我開始一個新的認沽即

認沽P1 =新的認沽( 「/ 行鍵」)之間;

該p1放不應該工作,因爲該行已被鎖定,但在HBase 0.94時,當我嘗試它的工作。

關於行鎖Link Where i had seen about Row Lock我的理解是否有任何錯誤。如果不是單行事務支持如何處理out行鎖定。

回答

0

我相信只有在您發出table.put(p)命令之前該行纔會被鎖定。當你使用Put p = new Put(「row key」);您正在創建一個對象以保存有關寫入的信息,但您實際上並未與數據庫進行通信。當準備好嘗試寫入數據庫時​​,可以鍵入table.put(p)。如果兩個put()操作同時發生在同一行上,其中一個可能會失敗。但我認爲很長一段時間不能持有行鎖,因爲鎖定發生在HBase內部,並且無法在外部進行控制。因此,過程是這樣的:

  • 代碼發送付諸HBase的
  • HBase的內部鎖定該行對您
  • HBase的寫
  • HBase的解鎖行

數據這意味着,如果兩個人嘗試將put()發送到同一行,則只有一個會成功,HBase會向另一個客戶端發送錯誤消息。

假設兩個客戶端嘗試同時放置()同一個行鍵。

  • 客戶端1將投入
  • 客戶端2將放
  • HBase的鎖行客戶端1
  • ,因爲該行已被鎖定HBase的發送錯誤給客戶端2
  • HBase的寫客戶端1的數據
  • hbase解鎖該行

下面的ip地址和登錄時間ex這意味着如果某人同時從不同的IP地址登錄兩次,那麼只有一個IP將被寫入數據庫,但時間戳將與所寫入的IP匹配。

我可能不完全瞭解這一點,但這是我目前的理解。我希望它有幫助。

+0

有一個方法** getRowLock()**可以使用Put對象來調用。所以,我認爲在創建對象時只有行被鎖定。你說的話可能是正確的。 Thanx的回覆 – Rohit 2013-02-16 08:35:17

+0

我可以問你正在使用什麼版本的HBase API?我發現這個頁面http://tsunanet.net/~tsuna/asynchbase/api/org/hbase/async/RowLock.html這似乎表明行鎖可以由客戶端生成和保存。我相信作爲我的回答的一個修正,java客戶端將自動從服務器獲取鎖定,但只有在調用table.put()時它纔會獲得鎖定。很難找到有關這些問題的文檔,不是! – fabspro 2013-02-16 09:11:28

+0

爲了澄清,當你創建一個新的Put()對象時,你完全沒有接觸到服務器。但是當你調用table.put(p)時,java客戶端將在內部從服務器獲取鎖,然後寫入數據,然後釋放鎖。希望它有助於:) – fabspro 2013-02-16 09:12:27

2

HBase的工作方式是當應用Puts以確保行被寫入原子塊但它不提供snapshot isolation(您需要使用某些東西像omid如果你想的話)。

假設你的兩個put不是從同一個客戶端發送的(在這種情況下,它們可能是同一個事務的一部分),除非HBase會崩潰或發生超時(比如因爲壓縮)。您將兩個投入將在HBase中連續應用,具體取決於他們到達的順序。