当前位置: 首页 > article >正文

小满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`;
  }
}


http://www.kler.cn/a/16789.html

相关文章:

  • 使用 unicorn 和 capstone 库来模拟 ARM Thumb 指令的执行(一)
  • Llama架构及代码详解
  • UniApp 应用、页面与组件的生命周期详解
  • 基于碎纸片的拼接复原算法及MATLAB实现
  • 容器技术在DevOps中的应用
  • Unity学习笔记(4):人物和基本组件
  • 1.软件测试
  • 常见元件、封装、尺寸、表面处理等
  • C语言中的三种语句
  • fastai2 实现SSD
  • 1699_simulink代码生成配置初级方案
  • 【Java】内部类Object类
  • SpringBoot整合Redis实现点赞、收藏功能
  • @TransactionalEventListener的使用和实现原理
  • 【五一创作】【Simulink】采用延时补偿的三相并网逆变器FCS-MPC
  • 如何在CentOS上详细安装PageOffice进行企业文档管理和协作
  • Java 基础入门篇(五)—— 面向对象编程
  • 05_从0运行,重定位,初始化,中断再到定时器
  • kafka单机配置
  • 探索三维世界【3】:Three.js 的 Geometry 几何体 与 Material 材质
  • 《QDebug 2023年4月》
  • 烟火识别智能监测系统 yolov5
  • 生物信息学中---数据集不平衡的处理方法
  • 小红书违禁词有哪些,小红书违禁词汇总分享
  • 来上海一个月的记录、思考和感悟
  • ffmpeg-mov-metadate不识别Bug修复