ビジネスの4つの特徴
トランザクションには、ACID と呼ばれる原子性、一貫性、分離、持続時間という 4 つの基本的な特性があります。
① アトミック性
トランザクションのアトミック性とは、トランザクションがアトミックな操作シーケンス単位でなければならないことを意味します。トランザクションに含まれる各操作は、1 回の実行中に、すべて成功するかすべて失敗するかの 2 つの状態のいずれかでしか表示できません。
すべての操作は、トランザクション全体の失敗の原因となり、実行された他の操作は元に戻され、ロールバックされます. すべての操作が成功した場合にのみ、トランザクション全体が成功したと見なされます.
② 一貫性 (Consistency)
トランザクションの一貫性とは、トランザクションの実行によってデータベースのデータの整合性と一貫性が損なわれないことを意味し、トランザクションの実行前と実行後、データベースは一貫した状態でなければなりません。
③ 分離
トランザクションの分離とは、並行環境において、並行するトランザクションが互いに分離され、トランザクションの実行が他のトランザクションに干渉されないことを意味します。つまり、異なるトランザクションが同じデータを同時に操作する場合、各トランザクションには独自の完全なデータ空間があります。
トランザクション内で使用される操作とデータは、他の同時実行トランザクションから分離され、同時に実行されるトランザクションは互いに干渉できません。
④ 永続性(デュレーション)
トランザクションの永続性とは、トランザクションがコミットされると、データベース内のデータを永続的に保存する必要があることを意味します。サーバーシステムがクラッシュしたり、サーバーがダウンしたり、その他の障害が発生した場合でも。データベースが再起動される限り、
トランザクション が正常に終了した後の状態に復元できる必要があります。
例えば
たとえば、Xiaoman が300、送金には 2 つのステップが必要で、最初は Xiaoman -300、2 番目のステップは Edison Chen+300 で、Xiaoman は 300 元を失いました。
コード
DTO
export class CreateMangerDto {
name:string;
money:number;
}
export class transferMoneyDto {
fromId:number;//发起人
toId:number; //接收人
money:number; //转账的钱
}
エンティティ
import { Entity, Column, PrimaryGeneratedColumn } from 'typeorm'
@Entity()
export class Manger {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
money: number;
}
マネージャー.コントローラー
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);
}
}
サービス
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`;
}
}