我有几个API运行CRUD操作,例如:
POST /table
POST /chair
并且在各自的服务文件中都有自己的存储库示例。以下是Table的服务文件的示例代码-table.service.ts
// import statements
export class TableService {
private readonly tableRepository: Repository<TableEntity>;
constructor(
@Inject('CONNECTION') private connection: DataSource,
) {
this.tableRepository = connection.getRepository(TableEntity);
}
async create(createTableDto: CreateTable) {
const result = await this.tableRepository.insert({...createTableDto});
return this.tableRepository.findOneOrFail({where: {id: result.identifiers[0].id}});
}
}
椅子的服务文件具有类似的实现。
我有另一个API,我们称之为/test,它将通过从create
和ChairEntity
的服务文件调用create
方法来执行插入操作-test.service.ts
export class TestService {
constructor(
private readonly tableService: TableService,
private readonly chairService: ChairService,
@Inject('CONNECTION') private connection: DataSource,
) {}
async create() {
const tableData = ...;
const chairData = ...;
tableService.create(tableData);
chairService.create(chairData);
}
如何在事务中运行上述操作?我不能使用DataSource.transaction,因为所有数据库操作都必须使用提供的实体管理器执行,但我不这样做。
我可以利用connection
对象吗?或者我们有其他方法吗?
1条答案
按热度按时间y53ybaqx1#
如果您使用的是最新版本的nestjs 9和typeOrm 0.3.11,下面是我实现这一点的方法:
为了从本质上解释它,您将从TypeORM注入数据源,并将其与事务管理器一起使用,您将创建一个回调函数,其中包含您将在其中使用的entityManager参数。
示例化用例User和User角色中的两个实体,添加要保存的数据,然后使用entityManager参数执行保存。
由于您使用的是事务管理器,因此它应该在失败时为您处理回滚,但需要进行测试以100%验证这一点。