typeorm中最简单的事务使用typeorm系列
Posted 狼丶宇先生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了typeorm中最简单的事务使用typeorm系列相关的知识,希望对你有一定的参考价值。
一、写在前面
喜欢nestjs的小伙伴在开发后台接口的时候可能会遇到同时给2个或者以上的表写入数据的情况,那么万一其中的某一张表失败了,那其它的表又成功了。这样就会导致一个很严重的问题,数据的一致性与准确性异常了。
很简单的一个例子,假如小明给小张转账10块钱,需要的操作如下:
1、小明的账户需要减去10块钱。
2、小张的账户需要加上10块钱。
3、给小明的转账记录表里面写入一条转出数据。
4、给小张的转账记录表里面写入一条转入数据。
上述的简介,你能想到这样的四个步骤是怎么样操作的吗?
本系列文章,迟来的更新。
关注公众号“笔优站长”可阅读全部文章哟。
二、直接上代码
为了简单一点我就直接写方法内的代码了,不写依赖类的了。需要注意的是本次使用的typeorm操作的是MySQL数据库,需要数据库的引擎为InnoDB。
typeorm 中文网中有具体的操作步骤,我这里就写简单点的伪代码了。
https://typeorm.biunav.com/zh/transactions.html
try {
//假设前面都已经算好了,我们就直接写数据库的操作部分
// 获取连接并创建新的queryRunner
const queryRunner = getConnection().createQueryRunner();
try {
// 使用我们的新queryRunner建立真正的数据库连
await queryRunner.connect();
// 开始事务:
await queryRunner.startTransaction();
//小明的账户需要减去10块钱。
await this.小明的账户表对象Repository.createQueryBuilder(null, queryRunner).update('小明的账户表对象').set('账户字段').where('条件对象').execute();
//给小明的转账记录表里面写入一条转出数据
await this.小明的账户转账记录表对象Repository.createQueryBuilder(null, queryRunner).insert().into('小明的账户转账记录表对象').values('转账记录对象').execute();
//小张的账户需要加上10块钱。
await this.小张的账户表对象Repository.createQueryBuilder(null, queryRunner).update('小张的账户表对象').set('账户字段').where('条件对象').execute();
//给小张的转账记录表里面写入一条转入数据。
await this.小张的账户转账记录表对象Repository.createQueryBuilder(null, queryRunner).insert().into('小张的账户转账记录表对象').values('转账记录对象').execute();
// 提交事务:
await queryRunner.commitTransaction();
} catch (error) {
// 有错误做出回滚更改
await queryRunner.rollbackTransaction();
return new Error('转账失败',error);
}
return '转账成功';
} catch (error) {
return new Error('服务异常',error);
}
以上操作的步骤就是一个简单的事务使用场景了。有需要的小伙伴可以将上面的伪代码替换为真实的语句即可。
三、总结
一个完整的事务,要么都执行成功,如果两个操作中有任意一个操作失败,则整个流程就应该是失败的,已经执行的操作就应当回滚。
在数据库中使用事务,可以保证多个数据库操作的一致性,这就是一个简单的事务的使用场景。
留个彩蛋
文中提到的queryRunner只是typeorm事务中的一种方法,其实typeorm还支持别的事务使用方法,你知道是什么吗?
五、写在后面
上面就是一个简单的事务使用场景的全部内容了,你学废了吗?
有问题请留言或者@博主,谢谢支持o( ̄︶ ̄)o~
感谢您的阅读,如果此文章或项目对您有帮助,请扫个二维码点个关注吧,若可以的话再给个一键三连吧!
公众号阅读的朋友可以点一下右下角的在看和分享哦。
GitHub有开源项目,需要的小伙伴可以顺手star一下!
GitHub: https://github.com/langyuxiansheng
更多信息请关注公众号: “笔优站长”
以上是关于typeorm中最简单的事务使用typeorm系列的主要内容,如果未能解决你的问题,请参考以下文章