2013-02-16 37 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中连续应用,具体取决于他们到达的顺序。