From 6854cfbcaca9f684a38542b9313c1e2bf04cd34a Mon Sep 17 00:00:00 2001 From: clarkdave Date: Wed, 28 Nov 2018 10:17:03 +0000 Subject: [PATCH] add `lock` method to SelectQueryBuilder https://github.com/typeorm/typeorm/issues/2037 --- src/query-builder/QueryExpressionMap.ts | 6 ++++++ src/query-builder/SelectQueryBuilder.ts | 15 +++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/src/query-builder/QueryExpressionMap.ts b/src/query-builder/QueryExpressionMap.ts index c5fae2dca13..4d63ceff8fe 100644 --- a/src/query-builder/QueryExpressionMap.ts +++ b/src/query-builder/QueryExpressionMap.ts @@ -147,6 +147,12 @@ export class QueryExpressionMap { */ lockVersion?: number|Date; + /** + * Locking clause. + * + */ + lockClause?: string; + /** * Parameters used to be escaped in final query. */ diff --git a/src/query-builder/SelectQueryBuilder.ts b/src/query-builder/SelectQueryBuilder.ts index 2a9ec07ff72..e8ac975ea24 100644 --- a/src/query-builder/SelectQueryBuilder.ts +++ b/src/query-builder/SelectQueryBuilder.ts @@ -990,6 +990,16 @@ export class SelectQueryBuilder extends QueryBuilder implements return this; } + /** + * Set a lock clause, passed directly into the query. + * e.g. `FOR UPDATE NOWAIT`. + * If set, will override `lockMode`. + */ + lock(clause: string): this { + this.expressionMap.lockClause = clause; + return this; + } + /** * Gets first raw result returned by execution of generated query builder sql. */ @@ -1612,6 +1622,11 @@ export class SelectQueryBuilder extends QueryBuilder implements */ protected createLockExpression(): string { const driver = this.connection.driver; + + if (this.expressionMap.lockClause) { + return ` ${this.expressionMap.lockClause}`; + } + switch (this.expressionMap.lockMode) { case "pessimistic_read": if (driver instanceof MysqlDriver) {