相关文章推荐
小胡子的煎饼果子  ·  男子高空坠下砸陷车顶 ...·  4 月前    · 
俊逸的创口贴  ·  如何在Android中清空logcat缓冲区 ...·  1 年前    · 
贪玩的火车  ·  Search Results - ...·  2 年前    · 
爱旅游的啤酒  ·  车海战术来袭!比亚迪2022新车先睹为快 - 知乎·  2 年前    · 
慷慨的黑框眼镜  ·  大叔我最爱这种。TV ...·  2 年前    · 
Code  ›  在NodeJS中利用bookshelf.js进行事务(transaction)管理开发者社区
https://cloud.tencent.com/developer/article/1547697
爱笑的帽子
1 年前
IMWeb前端团队

在NodeJS中利用bookshelf.js进行事务(transaction)管理

前往小程序,Get 更优 阅读体验!
立即前往
腾讯云
开发者社区
文档 建议反馈 控制台
首页
学习
活动
专区
工具
TVP
最新优惠活动
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
IMWeb前端团队
首页
学习
活动
专区
工具
TVP 最新优惠活动
返回腾讯云官网
社区首页 > 专栏 > 在NodeJS中利用bookshelf.js进行事务(transaction)管理

在NodeJS中利用bookshelf.js进行事务(transaction)管理

作者头像
IMWeb前端团队
发布 于 2019-12-03 16:28:01
1.5K 0
发布 于 2019-12-03 16:28:01
举报
文章被收录于专栏: IMWeb前端团队

术语 事务 指的是构成单一逻辑工作单元的操作的集合。比如:将钱从一个账户转到另一个账户就是一个事务,该事务包括分别针对每个账户的两个更新。

transaction
transaction

英文中 transaction 又是交易的意思,我想应该是因为事务(transaction)管理的场景首先是出现在利用银行账户进行交易(transaction)的过程中,所以计算机科学家们把数据库的这一特性称为事务(transaction)。

事务有以下几个属性:

  • 原子性(atomicity):事务的所有操作在数据库中要么全部正确反映出来,要么完全不反映。
  • 一致性(consistency):隔离执行事务时(换言之,在没有其他事务并发执行的情况下)保持数据库的一致性。
  • 隔离性(isolation): 尽管多个事务可能并发执行,但系统保证,对于任何一对事务Ti和Tj,在Ti看来,Tj或者在Ti开始之前已经执行完成,或者在Ti完成之后开始执行。因此,每一个事务都感觉不到系统中有其他事务在并发执行。
  • 持久性(durability):一旦事务执行成功,它对数据库的改变必须是永久的——即一个可能出现的系统故障不应该导致数据库忽略成功完成的事务。

这些性质通常成为 ACID特性 ,这一缩写来自四条性质的首字母。

在NodeJS中我们可以借助ORM框架来方便地实现事务操作,这里用 bookshelf.js 来举例说明。

bookshelf.js是一个基于 knex.js 的Node.js ORM框架,支持PostgreSQL,MySQL和SQLite3

简单来说,bookself是一个优秀的代码库,它易于阅读、理解、可扩展。它不强制你使用任何特定的校验scheme,而是提供灵活有效的关系或嵌套关系加载策略,一级类支持事务。它是一个精益的对象关系映射器(lean Object Relation Mapper),允许你使用原始的knex接口,因为当你需要自定义查询时,它有时并不能完全满足老一套的惯例。

bookshelf遵从和backbone.js一样棒的Models和Collections思想,使用相同的模式、命名惯例和哲学构建轻量、易于操控的ORM。如果你已经了解backbone,你就知道如何使用bookshelf.

bookshelf使用bluebird管理异步操作。

下面来演示如何使用bookshelf进行事务管理

model/db_config.json

代码语言: javascript
复制
{
  client: 'mysql',
  connection: {
    host     : '127.0.0.1',
    port     : 3306,
    user     : 'your_database_user',
    password : 'your_database_password',
    database : 'myapp_test',
    charset  : 'utf8'
}

model/base.js

代码语言: javascript
复制
'use strict'
 * init bookshelf connection
 * @type {[type]}
let Bookshelf = null,
    dbConfig = require('./db_config');
module.exports = function() {
    "use strict";
    if (Bookshelf) {
        return Bookshelf;
    var knex = require('knex')(dbConfig);
    Bookshelf = require('bookshelf')(knex);
     * This solves the circular module dependency problem created by Bookshelf models
     * in a previous commit #38d98bb4c33e91b636a3538bd546ebe7f5077328
    Bookshelf.plugin('registry');
    return Bookshelf;
};

model/users.js

代码语言: javascript
复制
'use strict'
const bookshelf = require('./base')();
// 一般情况下后台或者DBA的同学会帮我们把数据库和表建好,我们直接操作就好。所以我们只需要利用已有的表结构初始化一个ORM的实例来进行操作。
var Users = bookshelf.Model.extend({
    tableName: 'users'
module.exports = Users;

model/room.js

代码语言: javascript
复制
'use strict'
const bookshelf = require('./base')();
// 一般情况下后台或者DBA的同学会帮我们把数据库和表建好,我们直接操作就好。所以我们只需要利用已有的表结构初始化一个ORM的实例来进行操作。
var Room = bookshelf.Model.extend({
    tableName: 'room'
module.exports = Room;

controllers/transaction.js

代码语言: javascript
复制
'use strict'
const Bookshelf = require('../model/base')();
const Room = require('../model/room');
const Users = require('../model/users');
Bookshelf.transaction(function (t) {
    return Users.forge(data) // 需要存入users表的数据
    .save(null, { transacting: t })
    .then(function (users){
        return Room.forge({ userId: user.id }) // 将新增的user同时存入room表中
        .save(null, { transacting: t })
        .then(function (){
            return users; // 返回users表的model
 
推荐文章
小胡子的煎饼果子  ·  男子高空坠下砸陷车顶 公司门卫:刚刚内退,性格内向_社会.法治_湖南频道_红网
4 月前
俊逸的创口贴  ·  如何在Android中清空logcat缓冲区-腾讯云开发者社区-腾讯云
1 年前
贪玩的火车  ·  Search Results - Southern University Law Center
2 年前
爱旅游的啤酒  ·  车海战术来袭!比亚迪2022新车先睹为快 - 知乎
2 年前
慷慨的黑框眼镜  ·  大叔我最爱这种。TV 动画《指尖相触,恋恋不舍》宣传预告片公开,确定在 2024 年 1 月放送! - Gamicsoft
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号