Skip to content
This repository was archived by the owner on Apr 29, 2025. It is now read-only.

Commit 20083c6

Browse files
committed
refactor(db/startTransaction): add 30s timeout to transactions
1 parent 6a014b5 commit 20083c6

File tree

1 file changed

+22
-7
lines changed

1 file changed

+22
-7
lines changed

src/database/startTransaction.ts

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,41 @@ import { getPoolConnection } from './connection';
22
import { logError } from '../logger';
33
import { CFXCallback, CFXParameters } from '../types';
44
import { parseArguments } from 'utils/parseArguments';
5+
import { PoolConnection } from 'mysql2/promise';
6+
7+
async function runQuery(conn: PoolConnection | null, sql: string, values: CFXParameters) {
8+
[sql, values] = parseArguments(sql, values);
9+
10+
if (!conn)
11+
throw new Error(
12+
`Query: ${sql}\n${JSON.stringify(values)}\nConnection used by transaction timed out after 30 seconds.`
13+
);
14+
15+
const [rows] = await conn.query(sql, values);
16+
return rows;
17+
}
518

619
export const startTransaction = async (
720
invokingResource: string,
821
queries: (...args: any[]) => Promise<boolean>,
922
cb?: CFXCallback,
1023
isPromise?: boolean
1124
) => {
12-
const conn = await getPoolConnection();
25+
let conn: PoolConnection | null = await getPoolConnection();
26+
let response: boolean | null = false;
1327

1428
if (!conn) return;
1529

16-
let response = false;
30+
setTimeout(() => (response = null), 30000);
1731

1832
try {
1933
await conn.beginTransaction();
2034

21-
const commit = await queries(async (sql: string, values: CFXParameters) => {
22-
[sql, values] = parseArguments(sql, values);
23-
const [rows] = await conn.query(sql, values);
24-
return rows;
25-
});
35+
const commit = await queries((sql: string, values: CFXParameters) =>
36+
runQuery(response === null ? null : conn, sql, values)
37+
);
38+
39+
if (response === null) throw new Error(`Transaction has timed out after 30 seconds.`);
2640

2741
response = commit === false ? false : true;
2842
response ? conn.commit() : conn.rollback();
@@ -31,6 +45,7 @@ export const startTransaction = async (
3145
logError(invokingResource, cb, isPromise, err);
3246
} finally {
3347
conn.release();
48+
conn = null;
3449
}
3550

3651
return cb ? cb(response) : response;

0 commit comments

Comments
 (0)