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