在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我的理解是否有任何问题。如果不是单行事务支持如何处理行锁定。
答案 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会向另一个客户端发送错误消息。
假设两个客户端尝试同时放入()相同的行键。
根据上一个问题的ip地址和登录时间示例,这意味着如果有人同时从不同的IP地址登录两次,那么只有一个IP将写入数据库,但时间戳将匹配IP写的。
我可能不完全理解这一点,但这是我目前的理解。我希望它有所帮助。