小满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`;
  }
}
目录
相关文章
|
网络协议
免费的几款内网穿透工具
免费的几款内网穿透工具
14080 1
|
定位技术 API 开发者
地图:nuxt3高德地图简单使用
地图:nuxt3高德地图简单使用
916 0
|
JSON 监控 API
Shopee:对接海外仓API实现本地发货,优化物流时效
Shopee卖家可通过对接海外仓API实现本地发货,将物流时效从10-15天缩短至3-5天,显著提升买家体验与店铺转化率。本文详解API对接原理、步骤及代码示例,助力优化跨境物流效率。
|
算法 C语言
【软件工程题库】第五章 详细设计
【软件工程题库】第五章 详细设计
1091 0
|
移动开发 JavaScript Java
开发体育赛事平台:专家预测系统功能模块解析与技术实现全方案
专家预测系统是体育直播平台的核心商业化功能之一,该系统支持用户申请成为专家,经审核后可发布赛事预测内容,其他用户需付费查看,平台抽取分成。系统包含专家认证、内容发布、付费阅读、数据统计等功能模块,并通过MySQL数据库管理用户、文章及购买记录等信息。技术实现涵盖PHP后端(ThinkPHP框架)、Java Android客户端与Vue.js H5移动端,提供完整的预测发布、付费机制与胜率收益统计解决方案。
|
人工智能 算法 搜索推荐
算法备案全流程攻略:保姆级教程
在AI热潮下,算法成为互联网服务的核心驱动力,但也带来了大数据杀熟、算法歧视等问题。为规范行业发展,算法备案制度应运而生。该制度涵盖网站、APP等多种产品形式,要求企业在2个月内完成备案,依据《互联网信息服务算法推荐管理规定》等法规。未备案企业可能面临无法上线、罚款甚至刑罚的后果。备案流程包括注册、主体备案、信息填报及审核,确保算法合规运营。通过悬挂备案号、标识AI生成内容和定期自查,企业需持续维护算法安全与合规。
|
Kubernetes 架构师 Java
史上最全对照表:大厂P6/P7/P8 职业技能 薪资水平 成长路线
40岁老架构师尼恩,专注于帮助读者提升技术能力和职业发展。其读者群中,多位成员成功获得知名互联网企业的面试机会。尼恩不仅提供系统化的面试准备指导,还特别针对谈薪酬环节给予专业建议,助力求职者在与HR谈判时更加自信。此外,尼恩还分享了阿里巴巴的职级体系,作为行业内广泛认可的标准,帮助读者更好地理解各职级的要求和发展路径。通过尼恩的技术圣经系列PDF,如《尼恩Java面试宝典》等,读者可以进一步提升自身技术实力,应对职场挑战。关注“技术自由圈”公众号,获取更多资源。
|
弹性计算 Java 芯片
阿里云张伟分享 | 软件跨架构迁移(x86-&gt;ARM)的原理及实践
2023年8月31日,系列课程第四节《软件跨架构迁移(X86 -&gt; ARM)的原理及实践》正式上线,由阿里云弹性计算架构师主讲,内容涵盖:ARM与x86架构的差异分析;软件跨架构迁移的原理;软件迁移策略制定、环境准备、执行、测试优化及持续部署与维护等;以及软件迁移的全流程解读。
阿里云张伟分享 | 软件跨架构迁移(x86-&gt;ARM)的原理及实践
|
负载均衡 关系型数据库 PostgreSQL
【一文搞懂PGSQL】6. PostgreSQL + pgpool-II 实现读写分离
本文介绍了如何使用 PostgreSQL 和 pgpool-II 实现读写分离。pgpool-II 支持连接池、负载均衡等功能,适用于多种模式。文中详细描述了安装、配置及启动过程,并提供了示例命令,帮助读者快速搭建并验证读写分离环境。通过配置 `pgpool.conf` 文件指定监听地址、端口及节点信息等参数,确保系统的高效运行与故障转移。
|
Linux
`grep`命令搜索多个文件中的特定模式
`grep`命令搜索多个文件中的特定模式
2324 2

热门文章

最新文章