数据并发处理

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

数据库默认隔离级别

  • MySQL: Repeatable read;
  • PG : Read committed;

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的更多相关文章

  1. [React] 05 - Route: connect with ExpressJS

    基础: 初步理解:Node.js Express 框架 参见:[Node.js] 08 - Web Server and REST API 进阶: Ref: 如何系统地学习 Express?[该网页有 ...

  2. 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 ...

  3. Java学习笔记(05)

    目录: static的用法 主函数的定义 增强for的循环 单例设计模式 封装 一.Static的用法 1.对象的内存分析 对象的引用变量是存在于栈区,而在堆区开辟了一块内存空间,调用对象给成员变量赋 ...

  4. iOS系列 基础篇 05 视图鼻祖 - UIView

    iOS系列 基础篇 05 视图鼻祖 - UIView 目录: UIView“家族” 应用界面的构建层次 视图分类 最后 在Cocoa和Cocoa Touch框架中,“根”类时NSObject类.同样, ...

  5. 【web开发 | 移动APP开发】 Web 移动开发指南(2017.01.05更新)

    版本记录 - 版本1.0 创建文章(2016.12.30) - 版本1.1 更正了hybird相关知识:增加了参考文章(2017.01.05): + Web APP更正为响应式移动站点与页面,简称响应 ...

  6. javaSE基础05

    javaSE基础05:面向对象 一.数组 数组的内存管理 : 一块连续的空间来存储元素. Int [ ] arr = new int[ ]; 创建一个int类型的数组,arr只是一个变量,只是数组的一 ...

  7. Android 学习笔记之一 “Unable to establish loopback connection”

    今天碰到一个错误:Unable to establish loopback connection,在网上找各种方法都解决不了,后来看一个帖子说是要关闭系统防火墙,尝试了下还是不行.最后是进任务管理器杀 ...

  8. 异步编程系列第05章 Await究竟做了什么?

    p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提 ...

  9. loopback文档翻译

    最近在学习loopback,期间在strongloop的官网翻译了部分文章. 见:https://docs.strongloop.com/pages/viewpage.action?pageId=60 ...

随机推荐

  1. log4j:WARN No appenders could be found for logger

    直接写我的解决办法: 在src下面新建file名为log4j.properties内容如下:# Configure logging for testing: optionally with log f ...

  2. Ubuntu jsp平台使用JDBC来连接MySQL数据库

    Ubuntu 7.04 搭建Ubuntu jsp平台开发环境MySQL+tomcat+apache+j2sdk1.6在所有安装开始前先在Terminal中输入 rpm -q -a查看是否安装过rpm ...

  3. Mysql 基础 高级查询

    在西面内容中    car  和  nation   都表示 表名 1.无论 高级查询还是简单查询   都用  select.. from..语句   from  后面 加表名  可以使一张表也可以是 ...

  4. !带有指针的类和struct赋值的本质 - host to device

    //这个变量必须在while循环外面 //原因是当将loadModels[modelNum].g_3DModel[0]赋值给新建类后 //里面的数值拷贝过去了,而里头的指针只给了地址 //所以如果这个 ...

  5. Linux解决关闭终端后终止服务问题

    可使用nohup. 具体使用方法,参见:http://zjking.blog.51cto.com/976858/1117828

  6. Windows 删除 .svn标志

    之前一个项目是在SVN下面管理的,后来,考出来了,然后在Eclispe中使用,后来想用SVN管理起来,但是项目中,还是有.svn标志,只能先删除了.svn文件,然后在用svn管理起来,后来,发现.sv ...

  7. self和parent的用法

    总结 self  , parent 的用法               只能用在类的内部 self  本类  (不要理解成本对象) parent 父类 在引入自身的静态属性/静态方法 以及父类的方法时 ...

  8. 昨晚把家里的ie升级到11

    其实网上有些东西是实用的,不过之前的一次锁屏唤醒机器死机我就强制关机了,昨天把大部分驱动升级.

  9. Delphi函数的返回值(注意这里与C/C++等语言有差异)

    在C/C++等语言中,函数执行到 return 部分之后,将立即停止函数的执行,并返回值 但是在Delphi中不同 函数中,执行到result时,并不同于比如 C/C++ 中的 return,跳出函数 ...

  10. centos(x86 64位系统)使用boost

    1. 安装gcc,g++,make等开发环境 yum groupinstall "Development Tools" 2. 安装boost yum install boost b ...