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

bwitn5fc  于 2021-06-04  发布在  Hadoop
关注(0)|答案(2)|浏览(515)

在hbase中,为了提供单行事务支持,它使用了行锁定概念。例如,假设 Put p=new Put("/*Row Key*/"); 此语句将锁定行。
所以,在我们完成
表.put(p)
锁打不开。
所以,如果我开始一个新的看跌期权
put p1=新put(“/行键”);
p1 put应该不起作用,因为行已经被锁定,但是在hbase 0.94中,当我尝试它起作用时。
关于row lock link,我在哪里见过row lock,我的理解有什么错误吗。如果没有,那么单行事务支持是如何在没有行锁定的情况下工作的。

3yhwsihp

3yhwsihp1#

我相信在发出table.put(p)命令之前,行不会被锁定。当您使用put p=new put(“行键”)时;您正在创建一个对象来保存有关写入的信息,但实际上还没有与数据库通信。当您准备尝试写入数据库时,请键入table.put(p)。如果同一行上同时发生两个put()操作,其中一个可能会失败。但是我认为不可能长时间保持行锁,因为锁发生在hbase内部,不能在外部控制。所以,这个过程是这样的:
您的代码将put发送到hbase
hbase在内部为您锁定行
hbase写入数据
hbase解锁行
这意味着,如果两个人试图将put()发送到同一行,则只有一个人成功,hbase将向另一个客户端发送错误消息。
假设两个客户机试图同时放置()同一行键。
客户端1发送put
客户端2发送put
hbase锁定客户端1的行
hbase向客户端2发送错误,因为行被锁定
hbase写入客户端1的数据
hbase解锁行
按照上一个问题中的ip地址和登录时间示例,这意味着如果有人同时从不同的ip地址登录两次,那么只有一个ip将被写入数据库,但时间戳将与写入的ip匹配。
我可能不完全理解这一点,但这是我目前的理解。希望对你有帮助。

ktecyv1j

ktecyv1j2#

hbase的工作方式是,当应用put时,锁保存在regionserver(而不是客户端)中,以确保在原子块中写入行,但它不提供快照隔离(如果需要的话,需要使用类似omid的东西)。
假设两个put不是从同一个客户机发送的(在这种情况下,它们可能是同一事务的一部分),除非hbase崩溃或put之间的某个地方发生超时(例如由于压缩)。您的两个put将根据它们到达的顺序在hbase中串行应用。

相关问题