在NodeJS中利用bookshelf.js进行事务(transaction)管理
2015-12-05 12:41
656 查看
术语事务指的是构成单一逻辑工作单元的操作的集合。比如:将钱从一个账户转到另一个账户就是一个事务,该事务包括分别针对每个账户的两个更新。
英文中transaction又是交易的意思,我想应该是因为事务(transaction)管理的场景首先是出现在利用银行账户进行交易(transaction)的过程中,所以计算机科学家们把数据库的这一特性称为事务(transaction)。
事务有以下几个属性:
原子性:事务的所有操作在数据库中要么全部正确反映出来,要么完全不反映。
一致性:隔离执行事务时(换言之,在没有其他事务并发执行的情况下)保持数据库的一致性。
隔离性: 尽管多个事务可能并发执行,但系统保证,对于任何一对事务Ti和Tj,在Ti看来,Tj或者在Ti开始之前已经执行完成,或者在Ti完成之后开始执行。因此,每一个事务都感觉不到系统中有其他事务在并发执行。
持久性:一旦事务执行成功,它对数据库的改变必须是永久的——即一个可能出现的系统故障不应该导致数据库忽略成功完成的事务。
这些性质通常成为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
model/base.js
model/users.js
model/room.js
controllers/transaction.js
关于bookshelf.js的更多信息可以参考他们的官网:http://bookshelfjs.org/
英文中transaction又是交易的意思,我想应该是因为事务(transaction)管理的场景首先是出现在利用银行账户进行交易(transaction)的过程中,所以计算机科学家们把数据库的这一特性称为事务(transaction)。
事务有以下几个属性:
原子性:事务的所有操作在数据库中要么全部正确反映出来,要么完全不反映。
一致性:隔离执行事务时(换言之,在没有其他事务并发执行的情况下)保持数据库的一致性。
隔离性: 尽管多个事务可能并发执行,但系统保证,对于任何一对事务Ti和Tj,在Ti看来,Tj或者在Ti开始之前已经执行完成,或者在Ti完成之后开始执行。因此,每一个事务都感觉不到系统中有其他事务在并发执行。
持久性:一旦事务执行成功,它对数据库的改变必须是永久的——即一个可能出现的系统故障不应该导致数据库忽略成功完成的事务。
这些性质通常成为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
{ 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
'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
'use strict' const bookshelf = require('./base')(); // 一般情况下后台或者DBA的同学会帮我们把数据库和表建好,我们直接操作就好。所以我们只需要利用已有的表结构初始化一个ORM的实例来进行操作。 var Users = bookshelf.Model.extend({ tableName: 'users' }); module.exports = Users;
model/room.js
'use strict' const bookshelf = require('./base')(); // 一般情况下后台或者DBA的同学会帮我们把数据库和表建好,我们直接操作就好。所以我们只需要利用已有的表结构初始化一个ORM的实例来进行操作。 var Room = bookshelf.Model.extend({ tableName: 'room' }); module.exports = Room;
controllers/transaction.js
'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 }); }) }).then((users) => { // doSomething }).catch((error) => { //handle error })
关于bookshelf.js的更多信息可以参考他们的官网:http://bookshelfjs.org/
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- 数据库链接字符串查询网站
- DB2实例管理
- DB2实例管理
- 保障MySQL数据安全的14个最佳方法
- mysql问答汇集
- 创建一个空的IBM DB2 ECO数据库的方法
- Access 2000 数据库 80 万记录通用快速分页类
- 开通一个数据库失败的原因的和解决办法
- 一个简单的asp数据库操作类
- CentOS下DB2数据库安装过程详解
- EasyASP v1.5发布(包含数据库操作类,原clsDbCtrl.asp)第1/2页
- 使用ruby部署工具mina快速部署nodejs应用教程
- sql2008 还原数据库解决方案
- Oracle 数据库自动存储管理-安装配置
- Oracle 数据库 临时数据的处理方法
- 数据库分页查询语句数据库查询
- 最近比较流行的数据库挂马
- Oracle 手动创建数据库步骤详解