文档章节

phalapi-进阶篇4(notrom进阶以及事务操作)

喵了_个咪
 喵了_个咪
发布于 2015/11/23 18:47
字数 1707
阅读 216
收藏 1

#phalapi-进阶篇4(notrom进阶以及事务操作)#

##前言## 先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架.

写本篇教程的起因是在于在交流的时候有位童鞋提出了fetchPairs有BUG,原来一直没有仔细的了解过notorm的细节,趁这次机会主要把notorm之中的一些方便快捷的操作简单的说明一下,以及对与事务操作做一些我自己的简介以及使用notorm如何实现.

附上:

官网地址:http://www.phalapi.net/

开源中国Git地址:http://git.oschina.net/dogstar/PhalApi/tree/release

##1. 进一步了解notorm##

在notorm有很多方便并没有在PhalApi官方文档中有并没有非常详细的介绍过,在这里把一些可能会用到的notorm函数坐下介绍以及功能

###1.1 fetchPairs###

fetchPairs的使用和fetchAll相似但是他有一个特别之处,fetchPairs需要传递一个参数,这个参数是字符串的key值(比如 name id)当传递之后会出现这样的对比效果

DI()->notorm->user->fetchPairs('name');

DI()->notorm->user->fetchAll('name');

大家有看到区别吗?

嗯!是在返回的时候把在之前定义的key值放到了返回数组的key中

提示:在老版本中在使用过程中 Result.php 会有一句 821行的报错需要把

$values = array_values(iterator_to_array($row));
改成
$values = array_values($row);

###1.2 lock ###

lock操作是一种锁的行为,对于整表进行锁定,在当前用户释放锁之前此表不能在被操作,lock接受一个bool参数,默认是true锁表,使用如下

$userdb = DI()->notorm->user->lock(); //锁定表
$rs     = $userdb->fetchAll();

生成的sql语句如下:

SELECT * FROM user FOR UPDATE;

###1.3 加操作###

在很多时候我们会用到,数据库里面某个值+1或者是其他,我们不能在update的时候写入array('key' => 'key+1')因为在解析sql的时候 key+1 会带上引号作为一个字符串处理,当然是有解决方法的,如下

DI()->notorm->user->where('id', 1)->update(array('sum' => new NotORM_Literal("sum + 1")));

这样就可以生成不带引号的操作了

UPDATE user SET phone = sum + 1 WHERE (id = 1);

###1.4 group ###

group是去重操作,在notorm里面也封装的有,我们可以使用group用于统计有多少同名的用户等一些统计操作,或者是找出库里面不重复的城市名

DI()->notorm->user->select('name , count(*) as count')->group('name')->fetchAll();

会获得如下结果

###1.5 快速函数sum,count,max,min ###

在我们使用过程中虽然使用这类操作不是很多,但是使用notorm的快速函数依然感觉很方便,

  return DI()->notorm->user->sum('id');  //做加法
  return DI()->notorm->user->max('id');  //获取这个key中最大的值
  return DI()->notorm->user->min('id');  //获取这个key中最小的值
  return DI()->notorm->user->count();    //统计一共几条数据

##2. 事务操作##

其实很大一部分使用事务的目的是应为害怕并发的情况下导致,对数据库造成重复的操作,比如如下场景:

应用审核,有两个管理者对同一个应用审核,一个成功一个失败,然后是同时请求过来的,一起到了查询应用状态发现都是未审核,然后都去进行了审核操作,这个时候两个操作返回的都是审核成功,但是有一个人会看到审核状态和自己的审核结果不同,这个就是问题了,大部分解决此类问题时都会考虑到使用数据库事务操作,其实对于事务操作我的建议是能不用尽量不要使用,我简单聊一下我的几个观点

  1. 是否真的那么重要,对于上面的问题也许乍一看上去感觉,这样怎么可以呢,但是仔细想一想,这两个操作都是属于我们管理者的正常的操作,真正对于业务来说我认为是没有问题的,当然这是因为影响不大,如果是付款,一个订单从两个地方同时付款然后都发现是未付款,然后都进行了付款,这种业务就必须有处理方式了,所以是否使用事务要看业务是否非常需求

  2. 概率是怎么样的,对于一个程序来说,两条请求刚好通过了查询过程,一同到了修改的时候,不管是什么场景发生这种并发冲突的可能性是极其微小的,我觉得几乎可以忽略(当然前提是重要性没有那么的高,我们不能以偏概全)

  3. 曲线救国其实我们可以使用其他方式避免这种问题,我们可以把我们需要验证条件加入到Update的条件中这样两条语句总归会有一条语句执行失败

那么我们使用notorm中解决此类需要用到事务的问题呢

notorm提供了常规的事务操作如下

 //第一步:先指定待进行事务的数据库(通过获取一个notorm表实例来指定;否则会提示:PDO There is no active transaction)
 $user = DI()->notorm->user;
 //第二步:开启事务开关(此开关会将当前全部打开的数据库都进行此设置)
 DI()->notorm->transaction = 'BEGIN';

 //第三步:进行数据库操作
 $user->insert(array('name' => 'test3',));
 $user->insert(array('name' => 'test4',));

 //第四:提交/回滚
 DI()->notorm->transaction = 'COMMIT';
 //DI()->notorm->transaction = 'ROLLBACK';

还有一种处理方式就是在操作之前进行lock锁表

$user = DI()->notorm->user;
$user->lock();                                                  
$user->insert(array('name' => 'test3',));
$user->insert(array('name' => 'test4',));

这两种方式大家可以自行取舍

注:在phalapiV1.31版本后有自带提供事务操作可参考文档

##3. 总结##

在本小节中,对于notorm之中的一些特别的封装函数进行了一系列的介绍,以及对于事务提出了我的看法以及观点,和使用notorm的解决方案,希望看了这篇教程的童鞋对你的日常开发有所帮助

注:笔者能力有限有说的不对的地方希望大家能够指出,也希望多多交流!

官网QQ交流群:421032344 欢迎大家的加入!

© 著作权归作者所有

喵了_个咪
粉丝 336
博文 165
码字总数 214149
作品 4
杨浦
技术主管
私信 提问
PhalApi-v1.3.4 发布,PHP 轻量级开源接口框架

PhalApi-v1.3.4 (暑假炫酷版)发布,PHP轻量级开源接口框架 【前言】 在这火辣辣的季节里,在大家共同的努力下,PhalApi又迎来了重要的一次更新,在本次更新中更多的吸取了大家的建议,对Pha...

喵了_个咪
2016/08/02
1K
6
PhalApi-v1.3.1 (感恩版)发布,PHP 轻量级开源接口框架

PhalApi-v1.3.1 (感恩版)发布,PHP轻量级开源接口框架 [前言] 感恩节来临之际,PhalApi迎来了等候了一个多月的v1.3.1版本更新. 在v1.3.1版本中着重对1.3.0版本中存在BUG进行了修复,并且进一步...

喵了_个咪
2015/11/28
1K
5
phalapi-进阶篇3(自动加载和拦截器)

先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架. 最近工作上事情比较多所以更新比较慢希望大家见谅!这一次带来的是对于此框架自动加载机制的一个小引导,简单的聊...

喵了_个咪
2015/11/13
271
0
phalapi-进阶篇2(DI依赖注入和单例模式)

先在这里感谢phalapi框架创始人@dogstar,为我们提供了这样一个优秀的开源框架. 离上一次更新过去了快两周,在其中编写了一个关于DB分表分库解决大数据量的拓展,有兴趣的童鞋可以了解了解.废话...

喵了_个咪
2015/11/02
215
0
进阶篇:如何为ThinkPHP5编写优质的单元测试?

前言 在项目开发中,需要使用到ThinkPHP 5,为了编写单元测试,解决了几个难题,特此纪录分享一下。 难点1:TP5自带的单元测试感觉不好用,如何使用纯粹的原生PHPUnit? 在看云上,有TP5官方...

暗夜在火星
05/08
72
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
371
7
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
11
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
6
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
7
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部