From b59090f44d39176a7f5b097d88278d1074080f50 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 | 22 +++++++++++++++------- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/query-builder/QueryExpressionMap.ts b/src/query-builder/QueryExpressionMap.ts index 42f1f61642..1972efaffb 100644 --- a/src/query-builder/QueryExpressionMap.ts +++ b/src/query-builder/QueryExpressionMap.ts @@ -163,6 +163,12 @@ export class QueryExpressionMap { */ 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 4b8a8d71b2..5e9b2483a4 100644 --- a/src/query-builder/SelectQueryBuilder.ts +++ b/src/query-builder/SelectQueryBuilder.ts @@ -1019,6 +1019,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. */ @@ -1055,13 +1065,6 @@ export class SelectQueryBuilder extends QueryBuilder implements } catch (error) { - // rollback transaction if we started it - if (transactionStartedByUs) { - try { - await queryRunner.rollbackTransaction(); - } catch (rollbackError) { } - } - throw error; } finally { if (queryRunner !== this.queryRunner) { // means we created our own query runner @@ -1690,6 +1693,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) {