CockroachDB 中的行级锁定

Posted

技术标签:

【中文标题】CockroachDB 中的行级锁定【英文标题】:Row level locking in CockroachDB 【发布时间】:2021-06-11 12:25:06 【问题描述】:

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

我观察到的是,如果我锁定 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 子句中有主键,我只能使用行级锁吗?

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

以上是关于CockroachDB 中的行级锁定的主要内容,如果未能解决你的问题,请参考以下文章

MariaDB 中的行级锁

oracle行级锁和表级锁的区别?

Mysql中的行级锁表级锁页级锁

MySQL中的行级锁,表级锁,页级锁

MySQL中的行级锁表级锁页级锁

数据库中的锁