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系列的主要内容,如果未能解决你的问题,请参考以下文章

typeorm中最简单的事务使用typeorm系列

typeorm中最简单的事务使用typeorm系列

如何在 NestJs 中捕获 Typeorm 事务错误

Nestjs 与自定义存储库中的 Typeorm 事务

nest.js + typeORM:身份认证,事务管理

nestjs / TypeOrm 数据库事务