前言: 在 typeorm 开发文档中, 事务已经有很好的使用方法了, 但是在 nestjs 中, 会发现有点区别.
创建和使用事务
事务是使用Connection或EntityManager创建的。 例如:
import { getConnection } from "typeorm";
await getConnection().transaction(transactionalEntityManager => {});
or
import { getManager } from "typeorm";
await getManager().transaction(transactionalEntityManager => {});
然后
import { getManager } from "typeorm";
await getManager().transaction(async transactionalEntityManager => {
await transactionalEntityManager.save(users);
await transactionalEntityManager.save(photos);
// ...
});
但是在 nestjs 上, 会发现 import { getConnection } from "typeorm"; 和 import { getManager } from "typeorm"; 会提示已经放弃.
“getConnection”已弃用。ts(6385)
[globals.d.ts(64, 4): ]()该声明曾在此处标记为已弃用。
已声明“getConnection”,但从未读取其值。ts(6133)
(alias) function getConnection(connectionName?: string): DataSource
import getConnection
Gets connection from the connection manager. If connection name wasn't specified, then "default" connection will be retrieved.
*@deprecated*
正解的使用方法是
使用 Repository 实体就行了. 比如下面的 messageRepo
constructor(
@InjectRepository(Message) private messageRepo: Repository<Message>,
) { }
async send(messageDto: MessageDto): Promise<any> {
// 创建数据库事务, 在这里直接取得 connection, 用这个来开启事务, 然后用里面的 transactionalEntityManager 来代替操作 this.messageRepo 的操作. 如果出现异常错误, 数据库就会回退回去.
const connection = this.messageRepo.manager.connection
await connection.transaction(async transactionalEntityManager => {
// 保存消息
const message = new Message()
message.content = messageDto.content
let res = await transactionalEntityManager.save(message)
if (!res) {
Logger.error('消息未保存成功')
// 抛出前也可以作其它操作.
throw new HttpException('消息未保存成功', HttpStatus.INTERNAL_SERVER_ERROR);
}
return res
})
}
上面整体也可以用一个 try catch 来统一抛异常做处理.
其它的操作可以参考开发文档, 只是注意, connection 是从下面取到的就行了.
const connection = this.messageRepo.manager.connection