@mikro-orm/sql 7.1.9-dev.15 → 7.1.9-dev.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AbstractSqlConnection.d.ts +9 -0
- package/AbstractSqlConnection.js +23 -13
- package/package.json +2 -2
|
@@ -56,6 +56,15 @@ export declare abstract class AbstractSqlConnection extends Connection {
|
|
|
56
56
|
commit(ctx: ControlledTransaction<any, any>, eventBroadcaster?: TransactionEventBroadcaster, loggerContext?: LogContext): Promise<void>;
|
|
57
57
|
/** Rolls back the transaction or rolls back to the savepoint. */
|
|
58
58
|
rollback(ctx: ControlledTransaction<any, any>, eventBroadcaster?: TransactionEventBroadcaster, loggerContext?: LogContext): Promise<void>;
|
|
59
|
+
/**
|
|
60
|
+
* Waits until the transaction's connection has no query in flight. Kysely runs `rollback` straight
|
|
61
|
+
* on that connection instead of going through its connection provider, so a rollback caused by an
|
|
62
|
+
* aborted query would otherwise be sent while the aborted query is still running. That not only
|
|
63
|
+
* queues the rollback behind it on the server, it also overwrites the query id Kysely compares
|
|
64
|
+
* against before firing the `'cancel query'`/`'kill session'` control statement — the control
|
|
65
|
+
* statement is then discarded as stale and the abort never reaches the database.
|
|
66
|
+
*/
|
|
67
|
+
private waitForIdleTransaction;
|
|
59
68
|
private prepareQuery;
|
|
60
69
|
/** Executes a SQL query and returns the result based on the method: `'all'` for rows, `'get'` for single row, `'run'` for affected count. */
|
|
61
70
|
execute<T extends QueryResult | EntityData<AnyEntity> | EntityData<AnyEntity>[] = EntityData<AnyEntity>[]>(query: string | NativeQueryBuilder | RawQueryFragment, params?: readonly unknown[], method?: 'all' | 'get' | 'run', ctx?: Transaction, loggerContext?: LoggingOptions): Promise<T>;
|
package/AbstractSqlConnection.js
CHANGED
|
@@ -110,7 +110,15 @@ export class AbstractSqlConnection extends Connection {
|
|
|
110
110
|
return ret;
|
|
111
111
|
}
|
|
112
112
|
catch (error) {
|
|
113
|
-
|
|
113
|
+
// A failing rollback must not mask why the transaction failed in the first place — the
|
|
114
|
+
// `'kill session'` abort strategy tears the connection down, so the rollback that follows can
|
|
115
|
+
// only ever report the dead connection.
|
|
116
|
+
try {
|
|
117
|
+
await this.rollback(trx, options.eventBroadcaster, options.loggerContext);
|
|
118
|
+
}
|
|
119
|
+
catch (rollbackError) {
|
|
120
|
+
this.logger.warn('query', `Failed to roll back transaction: ${rollbackError.message}`);
|
|
121
|
+
}
|
|
114
122
|
throw error;
|
|
115
123
|
}
|
|
116
124
|
}
|
|
@@ -138,18 +146,8 @@ export class AbstractSqlConnection extends Connection {
|
|
|
138
146
|
trxBuilder = trxBuilder.setAccessMode('read only');
|
|
139
147
|
}
|
|
140
148
|
const trx = await trxBuilder.execute();
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
ctx.index ??= 0;
|
|
144
|
-
const savepointName = `trx${ctx.index + 1}`;
|
|
145
|
-
Reflect.defineProperty(trx, 'index', { value: ctx.index + 1 });
|
|
146
|
-
Reflect.defineProperty(trx, 'savepointName', { value: savepointName });
|
|
147
|
-
this.logQuery(this.platform.getSavepointSQL(savepointName), options.loggerContext);
|
|
148
|
-
}
|
|
149
|
-
else {
|
|
150
|
-
for (const query of this.platform.getBeginTransactionSQL(options)) {
|
|
151
|
-
this.logQuery(query, options.loggerContext);
|
|
152
|
-
}
|
|
149
|
+
for (const query of this.platform.getBeginTransactionSQL(options)) {
|
|
150
|
+
this.logQuery(query, options.loggerContext);
|
|
153
151
|
}
|
|
154
152
|
await options.eventBroadcaster?.dispatchEvent(EventType.afterTransactionStart, trx);
|
|
155
153
|
return trx;
|
|
@@ -173,6 +171,7 @@ export class AbstractSqlConnection extends Connection {
|
|
|
173
171
|
/** Rolls back the transaction or rolls back to the savepoint. */
|
|
174
172
|
async rollback(ctx, eventBroadcaster, loggerContext) {
|
|
175
173
|
await eventBroadcaster?.dispatchEvent(EventType.beforeTransactionRollback, ctx);
|
|
174
|
+
await this.waitForIdleTransaction(ctx);
|
|
176
175
|
if ('savepointName' in ctx) {
|
|
177
176
|
await ctx.rollbackToSavepoint(ctx.savepointName).execute();
|
|
178
177
|
this.logQuery(this.platform.getRollbackToSavepointSQL(ctx.savepointName), loggerContext);
|
|
@@ -183,6 +182,17 @@ export class AbstractSqlConnection extends Connection {
|
|
|
183
182
|
}
|
|
184
183
|
await eventBroadcaster?.dispatchEvent(EventType.afterTransactionRollback, ctx);
|
|
185
184
|
}
|
|
185
|
+
/**
|
|
186
|
+
* Waits until the transaction's connection has no query in flight. Kysely runs `rollback` straight
|
|
187
|
+
* on that connection instead of going through its connection provider, so a rollback caused by an
|
|
188
|
+
* aborted query would otherwise be sent while the aborted query is still running. That not only
|
|
189
|
+
* queues the rollback behind it on the server, it also overwrites the query id Kysely compares
|
|
190
|
+
* against before firing the `'cancel query'`/`'kill session'` control statement — the control
|
|
191
|
+
* statement is then discarded as stale and the abort never reaches the database.
|
|
192
|
+
*/
|
|
193
|
+
async waitForIdleTransaction(ctx) {
|
|
194
|
+
await ctx.getExecutor().provideConnection(async () => undefined);
|
|
195
|
+
}
|
|
186
196
|
prepareQuery(query, params = []) {
|
|
187
197
|
if (query instanceof NativeQueryBuilder) {
|
|
188
198
|
query = query.toRaw();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mikro-orm/sql",
|
|
3
|
-
"version": "7.1.9-dev.
|
|
3
|
+
"version": "7.1.9-dev.17",
|
|
4
4
|
"description": "TypeScript ORM for Node.js based on Data Mapper, Unit of Work and Identity Map patterns. Supports MongoDB, MySQL, PostgreSQL and SQLite databases as well as usage with vanilla JavaScript.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"data-mapper",
|
|
@@ -53,7 +53,7 @@
|
|
|
53
53
|
"@mikro-orm/core": "^7.1.8"
|
|
54
54
|
},
|
|
55
55
|
"peerDependencies": {
|
|
56
|
-
"@mikro-orm/core": "7.1.9-dev.
|
|
56
|
+
"@mikro-orm/core": "7.1.9-dev.17"
|
|
57
57
|
},
|
|
58
58
|
"engines": {
|
|
59
59
|
"node": ">= 22.17.0"
|