微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

CockroachDB 中的行级锁定

如何解决CockroachDB 中的行级锁定

我需要为更新获取行级锁,同时允许其他选择查询获取未锁定的预期行。

我观察到的是,如果我在 row1 上锁定,则不允许搜索其他行的其他选择查询

我有下表架构 -

CREATE TABLE lock_test(
    id int NOT NULL DEFAULT unique_rowid(),col_with_unique_index text NOT NULL,other_col text NOT NULL,CONSTRAINT "primary" PRIMARY KEY (id ASC),UNIQUE INDEX unique_idx (col_with_unique_index ASC),FAMILY "primary"(id,col_with_unique_index,other_col));

在 2 行下方插入 -

insert into lock_test(col_with_unique_index,other_col) values('val1','some_val');
insert into lock_test(col_with_unique_index,other_col) values('val2','some_val');

开通了2个终端-

一个终端 -

begin;
select * from lock_test where col_with_unique_index = 'val1' for update;

第二个终端 -

select * from lock_test where col_with_unique_index = 'val2';

期望第二个终端显示 val2 的结果但它没有(进入等待),而是在我在第一个终端中执行提交后第二个终端显示结果。

我尝试将 where 子句从 col_with_unique_index 更改为 id,这是此处的主键,这次第二个终端没有等待并显示预期结果。 >

我无法理解这里的行为。如果 where 子句中有主键,我可以只使用行级锁吗?

解决方法

我尝试将 where 子句从 col_with_unique_index 更改为这里的主键 id,这次第二个终端没有等待并显示预期结果。

我无法理解这里的行为。如果 where 子句中有主键,我可以只使用行级锁吗?

我怀疑这里发生的事情是表中的行数非常少,优化器确定扫描主索引比查看唯一索引便宜。我们最近对这些色调进行了一些调整,以解释这种争论。您可以使用以下命令强制扫描二级索引:select * from lock_test@unique_idx where col_with_unique_index = 'val2'; 或者您可以添加更多数据并运行统计信息(应自动运行)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?