HBase单行事务支持中的行锁定

时间:2013-02-16 06:46:29

标签: hadoop nosql hbase bigdata

在HBase中,为了提供单行事务支持,它使用行锁定概念。例如,假设

Put p=new Put("/*Row Key*/");此语句将锁定该行。

所以,直到我们完成

  

table.put(p)的

锁定不会被释放。

所以,如果我开始新的推,即

之间
  

put p1 = new Put(“/ Row Key ”);

p1 put应该不起作用,因为该行已被锁定但在HBase 0.94时我尝试了它的工作。

关于行锁Link Where i had seen about Row Lock我的理解是否有任何问题。如果不是单行事务支持如何处理行锁定。

2 个答案:

答案 0 :(得分:2)

HBase的工作方式是,当应用Puts时,锁定保存在regionserver(而不是客户端)中,以确保行写入原子块但不提供snapshot isolation(需要)如果你愿意,可以使用像omid这样的东西。

假设你的两个put不是从同一个客户端发送的(在这种情况下它们可能是同一个事务的一部分),除非HBase崩溃或者在puts之间的某处发生超时(比如因为压缩)。根据他们到达的顺序,您将在HBase中串行应用两个看跌期权。

答案 1 :(得分:0)

我相信在您发出table.put(p)命令之前,该行不会被锁定。当你使用Put p = new Put(“row key”);您正在创建一个对象来保存有关写入的信息,但您实际上还没有与数据库进行通信。准备好尝试写入数据库时​​,键入table.put(p)。如果两个put()操作同时发生在同一行上,则其中一个可能会失败。但我认为很长时间不能持有行锁,因为锁定发生在HBase内部并且无法在外部进行控制。所以,这个过程看起来像这样:

  • 您的代码将put发送到hbase
  • hbase在内部为您锁定行
  • hbase写入数据
  • hbase解锁行

这意味着,如果两个人尝试将put()发送到同一行,则只有一个会成功,HBase会向另一个客户端发送错误消息。

假设两个客户端尝试同时放入()相同的行键。

  • 客户端1发送
  • 客户端2发送
  • 客户端1的hbase锁定行
  • hbase向客户端2发送错误,因为该行已锁定
  • hbase写入客户端1的数据
  • hbase解锁行

根据上一个问题的ip地址和登录时间示例,这意味着如果有人同时从不同的IP地址登录两次,那么只有一个IP将写入数据库,但时间戳将匹配IP写的。

我可能不完全理解这一点,但这是我目前的理解。我希望它有所帮助。