nestjs[事务的作用及事务的两种常规使用方式]

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 '删除成功!';
  }
}
注意:以上两种仅仅只是常规方式,还有其他的事务使用方式,有需要可以去官网了解。
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
nestjs是一个基于Node.js的开发框架,而是nestjs中常用的一个数据库ORM工具。在nestjs使用typeorm进行事务回滚可以通过以下步实现: 1. 首先,你需要在nestjs项目中安装typeorm和数据库驱动程序(如mysql、等)的相关依赖。 2. 在中,你可以使用装饰器`@()`来标记一个方法需要在事务中执行。这个装饰器可以应用在controller或service层方法上。 3. 在需要回滚事的方法中,你可以使用typeorm提供的`EntityManager`来管理事务。通过调用`entityManager.transaction()`方法,你可以创建一个新的事务。 4. 在事务中执行数据库操作时,如果发生错误或者需要回滚事务,你可以使用`entityManager.rollback()`方法来回滚事务。 5. 如果所有的数据库操作都成功完成,你可以使用`entityManager.commit()`方法来提交事务。 下面是一个nestjs使用typeorm进行事务回滚的示例代码: ```typescript import { Injectable } from '@nestjs/common'; import { InjectEntityManager } from '@nestjs/typeorm'; import { EntityManager } from 'typeorm'; @Injectable() export class MyService { constructor( @InjectEntityManager() private readonly entityManager: EntityManager, ) {} @Transaction() async myMethod(): Promise<void> { try { await this.entityManager.transaction(async (entityManager) => { // 在事务中执行数据库操作 await entityManager.query('INSERT INTO table1 (column1) VALUES (value1)'); await entityManager.query('INSERT INTO table2 (column2) VALUES (value2)'); }); } catch (error) { // 发生错误时回滚事务 await this.entityManager.rollback(); throw error; } } } ``` 在上面的示例中,`myMethod()`方法被标记为`@Transaction()`,表示该方法需要在事务中执行。在事务中,我们使用`entityManager.query()`方法执行数据库操作。如果发生错误,我们会回滚事务并抛出错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值