小满nestjs(第二十八章 nestjs 事务)

简介: 小满nestjs(第二十八章 nestjs 事务)

事务的四大特性

事务具有4个基本特征,分别是:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Duration),简称ACID

① 原子性

事务的原子性是指事务必须是一个原子的操作序列单元。事务中包含的各项操作在一次执行过程中,只允许出现两种状态之一,要么都成功,要么都失败

任何一项操作都会导致整个事务的失败,同时其它已经被执行的操作都将被撤销并回滚,只有所有的操作全部成功,整个事务才算是成功完成

② 一致性(Consistency)

事务的一致性是指事务的执行不能破坏数据库数据的完整性和一致性,一个事务在执行之前和执行之后,数据库都必须处以一致性状态。

③ 隔离性

事务的隔离性是指在并发环境中,并发的事务是互相隔离的,一个事务的执行不能被其它事务干扰。也就是说,不同的事务并发操作相同的数据时,每个事务都有各自完整的数据空间。

一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务是不能互相干扰的

④ 持久性(Duration)

事务的持久性是指事务一旦提交后,数据库中的数据必须被永久的保存下来。即使服务器系统崩溃或服务器宕机等故障。只要数据库重新启动,那么一定能够将其恢复到事务成功结束后的状态

原文 事务的四大特性_事务的四个特性_今天你学习了么的博客-CSDN博客

举例说明

例如小满要给 陈冠希 转账 三百块 ,转账需要两步首先小满-300,第二步陈冠希+300,只要任何一个步骤失败了都算失败,如果第一步成功了,第二步失败了,那小满就亏损三百块。

代码

 

DTO

export class CreateMangerDto {
    name:string;
    money:number;
}
export class transferMoneyDto {
    fromId:number;//发起人
    toId:number; //接收人
    money:number; //转账的钱
}

entities

import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm'
@Entity()
export class Manger {
    @PrimaryGeneratedColumn()
    id: number;
    @Column()
    name: string;
    @Column()
    money: number;
}

manger.controller

import { Controller, Get, Post, Body, Patch, Param, Delete } from '@nestjs/common';
import { MangerService } from './manger.service';
import { CreateMangerDto,transferMoneyDto } from './dto/create-manger.dto';
import { UpdateMangerDto } from './dto/update-manger.dto';
@Controller('manger')
export class MangerController {
  constructor(private readonly mangerService: MangerService) {}
  //创建人API
  @Post()
  create(@Body() createMangerDto: CreateMangerDto) {
    console.log(createMangerDto)
    return this.mangerService.create(createMangerDto);
  }
  //转账API
  @Post('/transferMoney')
  transferMoney(@Body() transferMoneyDto: transferMoneyDto) {
    return this.mangerService.transferMoney(transferMoneyDto);
  }
  @Get()
  findAll() {
    return this.mangerService.findAll();
  }
  @Get(':id')
  findOne(@Param('id') id: string) {
    return this.mangerService.findOne(+id);
  }
  @Patch(':id')
  update(@Param('id') id: string, @Body() updateMangerDto: UpdateMangerDto) {
    return this.mangerService.update(+id, updateMangerDto);
  }
  @Delete(':id')
  remove(@Param('id') id: string) {
    return this.mangerService.remove(+id);
  }
}

service

import { Injectable } from '@nestjs/common';
import { CreateMangerDto, transferMoneyDto } from './dto/create-manger.dto';
import { UpdateMangerDto } from './dto/update-manger.dto';
import { Manger } from './entities/manger.entity'
import { InjectRepository } from '@nestjs/typeorm';
import { Repository, Like } from 'typeorm';
@Injectable()
export class MangerService {
  constructor(@InjectRepository(Manger) private readonly money: Repository<Manger>) {
  }
  create(createMangerDto: CreateMangerDto) {
    return this.money.save(createMangerDto);
  }
  async transferMoney(transferMoneyDto: transferMoneyDto) {
    //return this.manger.save(transferMoneyDto);
    try {
       //typeOrm 事务
      return await this.money.manager.transaction(async manager => {
        const from = await this.money.findOne({ where: { id: transferMoneyDto.fromId } })
        const to = await this.money.findOne({ where: { id: transferMoneyDto.toId } })
        console.log(from.money >= transferMoneyDto.money)
        if (from.money >= transferMoneyDto.money) {
          manager.save(Manger, { id: transferMoneyDto.fromId, money: from.money - transferMoneyDto.money })
          manager.save(Manger, { id: transferMoneyDto.toId, money: to.money + transferMoneyDto.money } )
          return {
            message: "转账成功"
          }
        } else {
          return {
            message: "转账失败 余额不足"
          }
        }
      })
    }
    catch (e) {
      return {
        message: e
      }
    }
  }
  findAll() {
    return `This action returns all manger`;
  }
  findOne(id: number) {
    return `This action returns a #${id} manger`;
  }
  update(id: number, updateMangerDto: UpdateMangerDto) {
    return `This action updates a #${id} manger`;
  }
  remove(id: number) {
    return `This action removes a #${id} manger`;
  }
}
目录
相关文章
|
前端开发
小满nestjs(第十章 nestjs 提供者)
如果服务 之间有相互的依赖 或者逻辑处理 可以使用 useFactory
189 0
小满nestjs(第十章 nestjs 提供者)
|
中间件
小满nestjs(第十二章 nestjs 中间件)
中间件是在路由处理程序 之前 调用的函数。 中间件函数可以访问请求和响应对象
236 4
小满nestjs(第十二章 nestjs 中间件)
|
JavaScript 前端开发
[Nestjs] 使用ncc加快启动速度
通过使用 ncc 可以将 NestJS 应用程序打包成一个单独的可执行文件,这可以加快应用程序的启动速度。下面是使用 ncc 加快 NestJS 应用程序启动速度的步骤:
326 0
|
前端开发
小满nestjs(第二十七章 nestjs typeOrm关系)
在我们开始的过程中,肯定不会把数据存在一个表里面,我们会进行分表,把数据分开存,然后通过关联关系,联合查询。
220 0
小满nestjs(第二十七章 nestjs typeOrm关系)
|
前端开发
小满nestjs(第九章 nestjs Session)
session 是服务器 为每个用户的浏览器创建的一个会话对象 这个session 会记录到 浏览器的 cookie 用来区分用户
330 0
小满nestjs(第九章 nestjs Session)
|
中间件 数据安全/隐私保护
小满nestjs(第二十一章 nestjs 守卫)
守卫有一个单独的责任。它们根据运行时出现的某些条件(例如权限,角色,访问控制列表等)来确定给定的请求是否由路由处理程序处理。这通常称为授权。在传统的 Express 应用程序中,通常由中间件处理授权(以及认证)。中间件是身份验证的良好选择,因为诸如 token 验证或添加属性到 request 对象上与特定路由(及其元数据)没有强关联。
240 0
小满nestjs(第二十一章 nestjs 守卫)
|
JavaScript API
小满nestjs(第十五章 nestjs 和 RxJs)
nterval 五百毫秒执行一次 pipe 就是管道的意思 管道里面也是可以去掉接口的支持处理异步数据 去处理数据 这儿展示 了 map 和 filter 跟数组的方法是一样的 最后 通过观察者 subscribe 接受回调
145 0
小满nestjs(第十五章 nestjs 和 RxJs)
|
JavaScript 数据可视化 关系型数据库
小满nestjs(第二十四章 nestjs 连接数据库)
Nestjs 集成数据库,由于企业用的Mysql 居多 我们就用Nestjs 连接 Mysql
475 0
小满nestjs(第二十四章 nestjs 连接数据库)
小满nestjs(第十七章 nestjs 异常拦截器)
让我们创建一个异常过滤器,它负责捕获作为HttpException类实例的异常,并为它们设置自定义响应逻辑。为此,我们需要访问底层平台 Request和 Response。我们将访问Request对象,以便提取原始 url并将其包含在日志信息中。我们将使用 Response.json()方法,使用 Response对象直接控制发送的响应。
151 0
小满nestjs(第十七章 nestjs 异常拦截器)
|
开发框架 JSON JavaScript
小满nestjs(第一章 介绍nestjs)
Nestjs 是一个用于构建高效可扩展的一个基于Node js 服务端 应用程序开发框架并且完全支持typeScript 结合了 AOP 面向切面的编程方式
229 0
小满nestjs(第一章 介绍nestjs)