在 TypeORM 中,事务可以通过多种方式进行处理,最常见的是使用 @Transaction()
装饰器或直接使用 queryRunner
。但如果要实现事务回调,我们通常会考虑直接使用EntityManager
或queryRunner
来手动控制事务的开始和结束,确保在事务的不同阶段执行特定的逻辑。
使用 EntityManager
的方式
下面是一个使用 EntityManager
的例子,其中包括了事务回调:
typescriptimport { getManager } from 'typeorm'; async function updateUserAndLogTransaction(userId: number, newUserData: any) { const entityManager = getManager(); await entityManager.transaction(async transactionalEntityManager => { try { // 更新用户信息 await transactionalEntityManager.update(User, userId, newUserData); // 记录事务日志 const log = { userId: userId, message: '用户数据更新成功' }; await transactionalEntityManager.insert(Log, log); // 事务回调,例如发送通知 console.log('事务执行成功,可以在这里执行回调函数,如发送通知等。'); } catch (error) { console.error('事务执行失败: ', error); // 这里可以处理错误回调 throw error; // 抛出错误,确保事务可以回滚 } }); }
使用 QueryRunner
的方式
如果需要更细致的控制,比如在事务中间查询状态或执行多个阶段的操作,可以使用 QueryRunner
:
typescriptimport { getConnection } from 'typeorm'; async function processJob() { const connection = getConnection(); const queryRunner = connection.createQueryRunner(); await queryRunner.connect(); await queryRunner.startTransaction(); try { // 第一步操作 await queryRunner.manager.save(...); // 根据第一步的结果决定后续步骤 if (someCondition) { await queryRunner.manager.save(...); } // 执行回调 someCallbackFunction(); // 提交事务 await queryRunner.commitTransaction(); } catch (error) { // 回滚事务 await queryRunner.rollbackTransaction(); // 错误处理回调 errorCallbackFunction(); } finally { // 释放queryRunner await queryRunner.release(); } }
在这个例子中,someCallbackFunction()
和 errorCallbackFunction()
就是在事务过程中根据不同情况触发的回调函数。这种方式给开发者提供了最大的灵活性来控制事务,包括在事务中途根据不同的业务逻辑执行不同的操作及回调。
总结
在 TypeORM 中,手动控制事务提供了执行复杂逻辑和事务回调的可能性。你可以在事务提交前后根据需要执行任何业务逻辑,这在处理需要多步骤确认和复杂状态管理的业务流程时非常有用。
2024年6月29日 12:07 回复