nestjs入门学习规划:https://blog.csdn.net/lxy869718069/article/details/114028195
事务的概念与作用
比如有两个表:账号表和信息表,而这两个表之间有关联。因此呢,我们在新增一个表的数据的时候就得给另外一个表也同时新增数据。然而这是两步操作(即第一步我要新增账号表数据,第一步在新增信息表数据)。假若其中有一个操作失败了呢?如账号新增成功,而信息失败了。如果不处理就会导致,这个账号没有信息的。因此事务就发生作用了。在一个事务中,必须要都成功才算是新增成功。否则都算失败。
事务的两种常规使用方式
第一种:
在conroller层中引入事务装饰器,并且当个参数传递到服务层。
如:
user.controller.ts内容如下:
import {
Controller,
Get,
Post,
Delete,
Body,
Query,
Put,
} from '@nestjs/common';
import { Transaction, TransactionManager, EntityManager } from 'typeorm';
import { UserService } from './user.service';
@Controller('user')
export class UserController {
constructor(private readonly userService: UserService) {}
/*
删除数据
由于有可能出现两张表同时进行操作的情况
因此开启事务事件:为了让同时进行的表操作要么一起完成,要么失败
@Transaction()和 @TransactionManager() manager: EntityManager 是事务的装饰器和对象
@Query ?id=xxx
*/
@Delete('del')
@Transaction()
delOne(
@Query() query,
@TransactionManager() manager: EntityManager,
): Promise<String> {
return this.userService.delOne(query, manager);
}
}
解读:在controller层的方法中新增一个参数@TransactionManager() manager: EntityManager并在将该方法使用@Transaction()进行装饰,此时就能拿到事务装饰器manager,将其传递给服务层就好了。
然后在服务层当作实体管理器使用即可
服务层user.service.ts 内容如下:
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository, getRepository, EntityManager } from 'typeorm';
import { UserInfo } from 'src/entities/user.info.entity';
import { UserAccount } from '../entities/user.account.entity';
@Injectable()
export class UserService {
/*
删除用户
*/
async delOne(query, manager): Promise<String> {
/*
1.为什么这里传入的是account而不是accountId:注意前面注入的是实体类UserInfo,因此传入实体类中对应的account即可
2.删除必须先删副表,再删主表
3.使用remove方法可以做到一个方法连带删除
*/
manager.delete(UserInfo, { account: query.id });
manager.delete(UserAccount, query.id); // 这里的第二个参数等同于{ id: query.id }
return '删除成功!';
}
}
解读:delOne中的manager即从controller层中传递过来的。manager是一个事务实体管理器,可以直接操作相关方法或者构建Query Builder查询。api参照:实体管理器api
这样就形成事务了。
第二种:
直接在服务层使用实体管理其的transaction()方法即可
服务层user.service.ts 内容如下:
import { Injectable } from '@nestjs/common';
import { Repository, getRepository, getManager } from 'typeorm';
import { UserInfo } from 'src/entities/user.info.entity';
import { UserAccount } from '../entities/user.account.entity';
@Injectable()
export class UserService {
/*
删除用户
*/
async delOne(query): Promise<String> {
await getManager().transaction(async transactionalEntityManager => {
transactionalEntityManager.delete(UserInfo, { account: query.id });
transactionalEntityManager.delete(UserAccount, query.id);
});
return '删除成功!';
}
}