真实业务里,有些动作不能做一半。
例如:
- 创建订单,同时扣库存
- 发布文章,同时写审计日志
- 转账时,同时扣减 A、增加 B
这就是事务的舞台。
在施工队宇宙里,事务可以理解为:
把某块施工区域暂时封闭,只允许这批操作要么全部验收通过,要么全部回滚。
await dataSource.transaction(async (manager) => {
const post = manager.create(Post, {
title: "TypeORM 事务不是魔法",
});
await manager.save(post);
const log = manager.create(AuditLog, {
action: "CREATE_POST",
targetId: post.id,
});
await manager.save(log);
});#事务最重要的一条铁律
进入事务以后,所有数据库操作都要用事务里提供的 manager。
不要这样:
await dataSource.transaction(async (manager) => {
await manager.save(post);
await globalUserRepository.save(user); // 不要这样
});正确心智是:
你既然进了封闭施工区,
就必须走封闭施工区里的专用调度员。否则你以为在一个事务里,实际上有些操作已经跑到施工区外面去了。