From a2f76b346f14967912d31deb9b892b691827ac7c 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, 20 insertions(+), 1 deletion(-) diff --git a/src/query-builder/QueryExpressionMap.ts b/src/query-builder/QueryExpressionMap.ts index 42f1f61642..d5567f2094 100644 --- a/src/query-builder/QueryExpressionMap.ts +++ b/src/query-builder/QueryExpressionMap.ts @@ -162,6 +162,12 @@ export class QueryExpressionMap { * By default the soft-deleted rows are not included. */ withDeleted: boolean = false; + + /** + * 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 6640ce749e..253afba6e2 100644 --- a/src/query-builder/SelectQueryBuilder.ts +++ b/src/query-builder/SelectQueryBuilder.ts @@ -1012,13 +1012,21 @@ export class SelectQueryBuilder extends QueryBuilder implements } /** - * Disables the global condition of "non-deleted" for the entity with delete date columns. */ withDeleted(): this { this.expressionMap.withDeleted = true; return this; } + /** + * Set a lock clause, passed directly into the query. + * 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. */ @@ -1690,6 +1698,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 || driver instanceof AuroraDataApiDriver) {