小满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`;
  }
}
目录
相关文章
|
JSON 前端开发 Java
SpringBoot之响应的详细解析
SpringBoot之响应的详细解析
213 0
|
Java 数据库连接 数据库
【MyBatis】spring整合mybatis教程(详细易懂)
Spring提供了一种轻量级的容器和依赖注入的机制,可以简化应用程序的配置和管理。会初始化N个数据库链接对象,一般在10个,当需要用户请求操作数据库时候,那么就会直接在数据库连接池中获取链接,用完放回连接池中。我们的实体类创建属性的时候我写get、set等方法,过于麻烦,但是我们有一个lombok,可以节约掉这些。这里是自己本地路径的MySQL的jar包,是需要更改的,路径赋值后也需要再加上。把我们的生成的BookMapper里面的方法复制到我们新建的BookBiz里面。选中对应的项目,依次选中生成。
【MyBatis】spring整合mybatis教程(详细易懂)
|
JSON JavaScript 前端开发
成功解决:正则表达式在vscode中会自动格式化一部分
这篇文章讨论了在Visual Studio Code中编写正则表达式时遇到的问题,即正则表达式因自动格式化而变形,并提供了使用双反斜杠、确保在字符串中定义正则表达式、检查文件类型等解决方法来避免这一问题。
成功解决:正则表达式在vscode中会自动格式化一部分
|
算法 C语言
【软件工程题库】第五章 详细设计
【软件工程题库】第五章 详细设计
838 0
|
NoSQL Ubuntu Linux
Linux下编译安装最新稳定版Redis
Linux下编译安装最新稳定版Redis
Linux下编译安装最新稳定版Redis
|
监控 调度 Python
电脑监控软件所含的CPU资源监控的代码(使用psutil库)
本文使用psutil库来获取CPU使用率、运行的进程、CPU温度、风扇速度和CPU核心的工作情况。这些信息可用于自定义电脑监控软件的CPU资源监控功能
851 1
|
机器学习/深度学习 云安全 人工智能
文心千帆:PPT 制作、数字人主播一键开播等应用场景惊艳到我了,下面给到Prompt工程详细教程应用场景及案例
文心千帆:PPT 制作、数字人主播一键开播等应用场景惊艳到我了,下面给到Prompt工程详细教程应用场景及案例
文心千帆:PPT 制作、数字人主播一键开播等应用场景惊艳到我了,下面给到Prompt工程详细教程应用场景及案例
|
存储 缓存 NoSQL
Redis进阶-Redis缓存优化
Redis进阶-Redis缓存优化
298 0
|
XML JSON 算法
Neo4j-APOC扩展与使用(上)
Neo4j-APOC扩展与使用 1.APOC简介与安装 1.1 APOC简介 1.2安装APOC
Neo4j-APOC扩展与使用(上)
|
存储 自然语言处理 小程序
【微信小程序】粤语教学平台-粤言粤语(下)
【微信小程序】粤语教学平台-粤言粤语
637 0