2

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

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

所以,直到我们完成

表.put(p)

锁不会被释放。

所以,在这之间,如果我开始一个新的 put 即

Put p1=new Put("/行键");

p1 put 不应该工作,因为该行已经被锁定但是当我尝试它工作时在 HBase 0.94 中。

关于行锁链接我在哪里看到了行锁我的理解有什么问题吗?如果不是单行事务支持如何与行锁定一起工作。

4

2 回答 2

3

HBase 的工作方式是,当应用 Put 以确保将行写入原子块但它不提供快照隔离时,锁保存在 regionserver(而不是客户端)中(您需要使用类似omid if你想要那个)。

假设您的两个 put 不是从同一个客户端发送的(在这种情况下,它们可能是同一事务的一部分)并且除非 HBase 将崩溃或发生超时(例如由于压缩)。您的两个 put 将根据它们到达的顺序在 HBase 中连续应用。

于 2013-02-16T22:56:20.253 回答
1

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

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

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

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

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

按照上一题的ip地址和登录时间的例子,如果有人同时登录两次,从不同的IP地址,那么只会将一个IP写入数据库,但时间戳会匹配写入的IP .

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

于 2013-02-16T07:24:06.137 回答