在数据库中,有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"]
1条答案
按热度按时间yws3nbqq1#
锁总是在索引上。因此,为了确保为查询获得最小数量的锁,查询需要以最佳方式使用索引,以创建最少的锁。
虽然索引是big and important topic,但强烈建议支持最佳查询(和节能),让我们看看问题中的查询。
这里有一个简单的表查找,没有连接,所以看看
where
条件。在status
上搜索需要一个状态索引。找到这个值后,结果按updated_at
排序。这构成了复合指数的第二部分。因此,SQL中的索引是通过以下方式创建的:
或者使用TypeORM文档: