我相信在您发出 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 .
我可能不完全理解这一点,但这是我目前的理解。我希望它有所帮助。