在MariaDB中锁定和跳过锁定的对象

o75abkj4  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(139)

在数据库中,有2行符合查询条件。如果我们运行两个并行查询,第一个查询锁定两行并返回一行,而第二个查询返回null
希望能够仅锁定一个(返回的)行以避免这种情况。

const queryRunner : QueryRunner = this.connect.createQueryRunner();
await queryRunner.connect();
await queryRunner.startTransaction();
const identificationProcess = await queryRunner.manager
            .getRepository(IdentificationProcessEntity)
            .createQueryBuilder("identification_process")
            .orderBy("identification_process.updated_at", "ASC")
            .where("identification_process.status = :status", { status: IdentificationStatusEnum.Scanning })
            .useTransaction(true)
            .setLock("pessimistic_write")
            .setOnLocked("skip_locked")
            .take(1)
            .getOne()

我试着改变查询参数。
MariaDB - v10.8.4
SQL:

query: SELECT `identification_process`.`uid` AS `identification_process_uid`, `identification_process`.`user_uid` AS `identification
_process_user_uid`, `identification_process`.`status` AS `identification_process_status`, `identification_process`.`attempts` AS `id
entification_process_attempts`, `identification_process`.`expire_at` AS `identification_process_expire_at`, `identification_process`
.`created_at` AS `identification_process_created_at`, `identification_process`.`updated_at` AS `identification_process_updated_at`, 
`identification_process`.`procedure_uid` AS `identification_process_procedure_uid` FROM `identification_process` `identification_pro
cess` WHERE `identification_process`.`status` = ? ORDER BY `identification_process`.`updated_at` ASC LIMIT 1 FOR UPDATE SKIP LOCKED 
-- PARAMETERS: ["Scanning"]
yws3nbqq

yws3nbqq1#

锁总是在索引上。因此,为了确保为查询获得最小数量的锁,查询需要以最佳方式使用索引,以创建最少的锁。
虽然索引是big and important topic,但强烈建议支持最佳查询(和节能),让我们看看问题中的查询。
这里有一个简单的表查找,没有连接,所以看看where条件。在status上搜索需要一个状态索引。找到这个值后,结果按updated_at排序。这构成了复合指数的第二部分。
因此,SQL中的索引是通过以下方式创建的:

CREATE INDEX idx_status_updated_at ON identification_process (status, updated_at)

或者使用TypeORM文档:

@Entity()
...
@Index(["status", "updated_at"])
...
export class identification_process {

相关问题