import sql from "mssql"; import { sdkLogger as logger } from "../../reporting-service/logger.js"; export interface SQLTransactionConfig { isolationLevel?: sql.IIsolationLevel; } export interface SQLTransactionOperation { execute(transaction: sql.Transaction, data: T): Promise; } export class SQLTransactionManager { constructor(private connection: sql.ConnectionPool) {} /** * Executes a transaction with the given operation and data, manages rollbacks * @param operation The SQLTransactionOperation to execute * @param data The sql input parameters to pass to the operation * @param config The configuration for the transaction * @returns The result of the operation; throws exceptions on failures */ async executeTransaction( operation: SQLTransactionOperation, data: T, config: SQLTransactionConfig = {} ): Promise { const transaction = new sql.Transaction(this.connection); const isolationLevel = config.isolationLevel || sql.ISOLATION_LEVEL.READ_COMMITTED; try { await transaction.begin(isolationLevel); const result = await operation.execute(transaction, data); await transaction.commit(); return result; } catch (error) { logger.error("Transaction error:", error); try { await transaction.rollback(); } catch (rollbackError) { logger.error("Rollback error:", rollbackError); } throw error; } } }