如何在Sveltekit+TypeORM+OracleDB同事务中查询未提交更新记录?
解决SvelteKit+TypeORM+OracleDB事务内无法读取自更新记录的问题
你遇到的核心问题是Node.js端TypeORM的事务上下文未正确关联UPDATE和SELECT操作,导致SELECT使用了非事务连接,无法获取同一事务内未提交的修改。以下是具体解决方案:
1. 用QueryRunner手动管理事务(最可靠方案)
放弃自动事务或装饰器,手动创建QueryRunner并绑定所有操作到同一实例,确保UPDATE和SELECT共享同一个事务上下文:
import { getConnection } from 'typeorm'; import YourEntity from '$lib/entities/YourEntity'; // 替换为你的实体类 async function updateAndFetchInTransaction() { const connection = getConnection(); const queryRunner = connection.createQueryRunner(); await queryRunner.connect(); await queryRunner.startTransaction(); try { // 执行UPDATE,使用queryRunner的manager await queryRunner.manager.update(YourEntity, { id: 1 }, { targetField: 'updated value' }); // 同一事务内执行SELECT,必须用同一个queryRunner的manager const updatedRecord = await queryRunner.manager.findOne(YourEntity, { id: 1 }); // 此时能拿到更新后的未提交数据 console.log(updatedRecord); await queryRunner.commitTransaction(); } catch (error) { await queryRunner.rollbackTransaction(); throw error; } finally { await queryRunner.release(); } }
2. 避免误用全局EntityManager
如果使用getManager()或依赖注入的全局EntityManager,可能会因为SvelteKit的请求上下文隔离,导致SELECT操作脱离当前事务。所有事务内的数据库操作必须使用事务专属的EntityManager/QueryRunner实例,不能混用全局实例。
3. 确认Oracle驱动的事务配置
在TypeORM配置中显式指定隔离级别,避免驱动默认设置覆盖你的配置:
// ormconfig.ts 或 SvelteKit的数据库配置文件 export default { type: 'oracle', host: 'your-oracle-host', port: 1521, username: 'db-user', password: 'db-pass', database: 'your-sid', entities: [YourEntity], isolationLevel: 'READ COMMITTED', // 保持与.NET一致的隔离级别 // 其他配置项 };
为什么.NET环境能正常工作?
.NET EF Core会自动将事务内的所有操作绑定到同一个数据库连接和事务上下文,而Node.js的TypeORM若操作实例不统一,会默认使用新的连接池连接,自然无法读取未提交的事务内修改。
内容的提问来源于stack exchange,提问作者dyn-do
相关产品推荐
相关产品推荐

