loopback 05
数据并发处理
ACID性质
- 原子性(Atomicity): 要么全部被执行,要么都不执行;
- 一致性(Consistency): 满足完整性约束;
- 隔离性(Isolation): 不应影响其他事务的执行;
- 持久性(Durability : 永久保存在数据库中;
隔离级别
- 未提交读(Read uncommitted): 允许脏读,可以看到其他事务尚未提交的修改;
- 提交读(Read committed): 写锁一直保持到事务结束,读锁在
SELECT
操作完成后马上释放,不要求范围锁; - 可重复读(Repeatable reads) : 读锁和写锁一直保持到事务结束,不要求范围锁;
- 可序列化(Serializable): 读锁和写锁保持直到事务结束后才能释放,查询中使用“WHERE”子句来获得一个范围锁;
- 较高的隔离级别能更好地保证数据一致性,但反过来会影响程序的并发性能;
读现象
- 脏读: 当一个事务允许读取另外一个事务修改但未提交的数据;
- 不可重复读: 一行数据获取两遍得到不同的结果(发生在
SELECT
操作没有获得读锁或者SELECT
执行完后马上释放了读锁) - 幻读: 两个完全相同的查询语句执行得到不同的结果集(没有获取范围锁的情况下执行
SELECT ... WHERE
操作可能会发生);
隔离级别vs读现象
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
未提交读 | 可能发生 | 可能发生 | 可能发生 |
提交读 | 可能发生 | 可能发生 | |
可重复读 | 可能发生 | ||
可序列化 |
隔离级别vs 锁持续时间
s
: 锁持续到当前语句执行完毕c
: 锁会持续到事务提交
隔离级别 | 写操作 | 读操作 | 范围操作 |
---|---|---|---|
未提交读 | s | s | s |
提交读 | c | s | s |
可重复读 | c | c | s |
可序列化 | c | c | c |
数据库默认隔离级别
loopback事务分离处理
一个例子
let currnetTx = null;
return Vote.count({
userId,
title: 'voteA:最美coser',
created_at: {
between: [`2015-12-${now.getDate()}`, `2015-12-${now.getDate() + 1}`]
}
}).then(count=> {
if(count > 0) {
return res.send({code:2, msg: 'voted before'});
}
return Vote.beginTransaction({
isolateionLevel: Vote.Transaction.REPEATABLE_READ,
tiemout: 30000
}).then(tx=> {
currentTx = tx
if(userId === staticId) return;
return Vote.create({userId, itemId: instanceId, title: 'voteA:最美coser'}, {transaction: currentTx});
}).then(()=>{
return VoteA.findOne({where: {itemId: instanceId}}, {transaction: currentTx})
}).then(voteA=> {
return voteA.updateAttributes({count: ++voteA.count}, {transaction: currentTx})
}).then(()=> {
if(currentTx) currentTx.commit();
console.log(`最美coser: userId-${userId} vote itemId-${instanceId}`);
return res.send({code: 1, msg: 'success!'});
})
}).catch(err=> {
if(currentTx) currentTx.rollback();
console.log(err);
return res.status(500).end();
})
loopback类型
loopback
中获取的时间类型就为Date
对象;loopback
中使用查询涉及到时间时使用UTC
时间;
loopback一个插入数据脚本例子
//seedDate
export const figureCategories = {
pvc: {name: '静态PVC'},
GK: {name: 'GK'},
figma: {name: 'figma'},
pf: {name: 'PF'},
human: {name: '人形'}
}
export const brandData = {
pvc: [
{name: 'Bandai/万代'},
{name: 'Goodsmile'},
{name: 'MegaHouse'}
],
GK: [
{name: 'Bandai/万代'},
{name: 'Goodsmile'},
{name: 'MegaHouse'}
],
figma: [
{name: 'Bandai/万代'},
{name: 'Goodsmile'},
{name: 'MegaHouse'}
],
pf: [
{name: 'Bandai/万代'},
{name: 'Goodsmile'},
{name: 'MegaHouse'}
],
human: [
{name: 'Bandai/万代'},
{name: 'Goodsmile'},
{name: 'MegaHouse'}
]
}
//seed
import Promise from 'bluebird';
import {figureCategories, brandData} from './seedData-01.js';
export default function(app, done) {
const FigureCategory = app.models.figureCategory;
const FigureBrand = app.models.figureBrand;
function initSeedData(category, brands) {
return FigureCategory.findOrCreate({
where: {name: category.name}
}, category).then(category=>{
return Promise.resolve(brands).map(brand=>{
return FigureBrand.findOrCreate({
where: {name: brand.name}
}, brand).then(brand=>{
return category[0].brands.add(brand[0]).catch(console.log);
})
}, {concurrency: 1});
}).catch(console.log);
}
Promise.resolve(Object.keys(figureCategories)).map(key=>{
return initSeedData(figureCategories[key], brandData[key])
}, {concurrency: 1}).then(()=>{
done();
}).catch(done);
}
数据库层面的匹配
scope
设置在json
文件
{
"scope": {
"limit": 10,
"where": {
"status": "online"
}
}
}
loopback 05的更多相关文章
- [React] 05 - Route: connect with ExpressJS
基础: 初步理解:Node.js Express 框架 参见:[Node.js] 08 - Web Server and REST API 进阶: Ref: 如何系统地学习 Express?[该网页有 ...
- java.io.IOException: Unable to establish loopback connection
1.错误描述 Starting preview server on port 8080 Modules: HTML5 (/HTML5) 2017-06-17 11:13:04.823:INFO::ma ...
- Java学习笔记(05)
目录: static的用法 主函数的定义 增强for的循环 单例设计模式 封装 一.Static的用法 1.对象的内存分析 对象的引用变量是存在于栈区,而在堆区开辟了一块内存空间,调用对象给成员变量赋 ...
- iOS系列 基础篇 05 视图鼻祖 - UIView
iOS系列 基础篇 05 视图鼻祖 - UIView 目录: UIView“家族” 应用界面的构建层次 视图分类 最后 在Cocoa和Cocoa Touch框架中,“根”类时NSObject类.同样, ...
- 【web开发 | 移动APP开发】 Web 移动开发指南(2017.01.05更新)
版本记录 - 版本1.0 创建文章(2016.12.30) - 版本1.1 更正了hybird相关知识:增加了参考文章(2017.01.05): + Web APP更正为响应式移动站点与页面,简称响应 ...
- javaSE基础05
javaSE基础05:面向对象 一.数组 数组的内存管理 : 一块连续的空间来存储元素. Int [ ] arr = new int[ ]; 创建一个int类型的数组,arr只是一个变量,只是数组的一 ...
- Android 学习笔记之一 “Unable to establish loopback connection”
今天碰到一个错误:Unable to establish loopback connection,在网上找各种方法都解决不了,后来看一个帖子说是要关闭系统防火墙,尝试了下还是不行.最后是进任务管理器杀 ...
- 异步编程系列第05章 Await究竟做了什么?
p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...
- loopback文档翻译
最近在学习loopback,期间在strongloop的官网翻译了部分文章. 见:https://docs.strongloop.com/pages/viewpage.action?pageId=60 ...
随机推荐
- linux权限不够,sh不能用
linux下权限不够 chmod +x 脚本命令 ./脚本命令 即可... sh startup.sh启动tomcat,出现 This file is needed to run this prog ...
- JavaScript高级程序设计学习笔记--基本概念
1.语句 ECMAScript中的语句以一个分号结尾:如果省略分号,则由解析器确定语句的结尾,如下例所示: var sum=a+b //即使没有分号也是有效的语句--推荐 var diff=a-b; ...
- HDU 4811 Ball -2013 ICPC南京区域现场赛
题目链接 题意:三种颜色的球,现给定三种球的数目,每次取其中一个放到桌子上,排成一条线,每次放的位置任意,问得到的最大得分. 把一个球放在末尾得到的分数是它以前球的颜色种数 把一个球放在中间得到的分数 ...
- yii 多表联合查询的几种方法
yii多表联合查询, 第一种,用command,自己拼接sql语句执行查询 第二种,用AR,model需继承下面的ar,执行queryall或queryrow方法 <?php //applica ...
- python 获取控制台输入
python想从控制台获取输入的的函数有两个一个是raw_input,一个是input. 这两个函数的区别是input获取的时候会精确到类型,假设输入的是1,那么获取的就是int型的变量,如果想输入字 ...
- db2 Hidden columns
When a table column is defined with the implicitly hidden attribute, that column is unavailable unle ...
- Linux安装mysql最新版本纪要
http://blog.csdn.net/frt007/article/details/50184143 http://blog.csdn.net/wb96a1007/article/details/ ...
- Vs注释,vsXML,VSXML注释
标签名称 说明 语法 参数 <summary> <summary> 标记应当用于描述类型或类型成员.使用<remarks> 添加针对某个类型说明的补充信息. < ...
- OS Boot Loader -- 启动器
这篇文章先抛出来,现在还没有彻底研究明白,但可以做个个人的小结和整理: 记得刚开始搞Linux的时候,普遍采用的是grub,后来有了grub2,尤其是在ubuntu那种非常差劲的不稳定的更新频繁的系统 ...
- MYSQL的增删改查语句样码
慢慢来,慢慢来.. 增: INSERT INTO person (person_id, fname, lname, gender, birth_date) VALUES (null, 'William ...