notrom進(jìn)階以及事務(wù)操作

2018-11-21 21:29 更新

PHALAPI-進(jìn)階篇4(NOTROM進(jìn)階以及事務(wù)操作)

前言

先在這里感謝phalapi框架創(chuàng)始人@dogstar,為我們提供了這樣一個(gè)優(yōu)秀的開源框架.

寫本篇教程的起因是在于在交流的時(shí)候有位童鞋提出了fetchPairs有BUG,原來(lái)一直沒(méi)有仔細(xì)的了解過(guò)notorm的細(xì)節(jié),趁這次機(jī)會(huì)主要把notorm之中的一些方便快捷的操作簡(jiǎn)單的說(shuō)明一下,以及對(duì)與事務(wù)操作做一些我自己的簡(jiǎn)介以及使用notorm如何實(shí)現(xiàn).

附上:

喵了個(gè)咪的博客:w-blog.cn

官網(wǎng)地址:http://www.phalapi.net/

開源中國(guó)Git地址:http://git.oschina.net/dogstar/PhalApi/tree/release

1. 進(jìn)一步了解notorm

在notorm有很多方便并沒(méi)有在PhalApi官方文檔中有并沒(méi)有非常詳細(xì)的介紹過(guò),在這里把一些可能會(huì)用到的notorm函數(shù)坐下介紹以及功能

1.1 fetchPairs

fetchPairs的使用和fetchAll相似但是他有一個(gè)特別之處,fetchPairs需要傳遞一個(gè)參數(shù),這個(gè)參數(shù)是字符串的key值(比如 name id)當(dāng)傳遞之后會(huì)出現(xiàn)這樣的對(duì)比效果

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

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

大家有看到區(qū)別嗎?

嗯!是在返回的時(shí)候把在之前定義的key值放到了返回?cái)?shù)組的key中

提示:在老版本中在使用過(guò)程中 Result.php 會(huì)有一句 821行的報(bào)錯(cuò)需要把

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

1.2 lock

lock操作是一種鎖的行為,對(duì)于整表進(jìn)行鎖定,在當(dāng)前用戶釋放鎖之前此表不能在被操作,lock接受一個(gè)bool參數(shù),默認(rèn)是true鎖表,使用如下

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

生成的sql語(yǔ)句如下:

SELECT * FROM user FOR UPDATE;

1.3 加操作

在很多時(shí)候我們會(huì)用到,數(shù)據(jù)庫(kù)里面某個(gè)值+1或者是其他,我們不能在update的時(shí)候?qū)懭隺rray('key' => 'key+1')因?yàn)樵诮馕鰏ql的時(shí)候 key+1 會(huì)帶上引號(hào)作為一個(gè)字符串處理,當(dāng)然是有解決方法的,如下

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

這樣就可以生成不帶引號(hào)的操作了

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

1.4 group

group是去重操作,在notorm里面也封裝的有,我們可以使用group用于統(tǒng)計(jì)有多少同名的用戶等一些統(tǒng)計(jì)操作,或者是找出庫(kù)里面不重復(fù)的城市名

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

會(huì)獲得如下結(jié)果

1.5 快速函數(shù)sum,count,max,min

在我們使用過(guò)程中雖然使用這類操作不是很多,但是使用notorm的快速函數(shù)依然感覺很方便,

  return DI()->notorm->user->sum('id');  //做加法
  return DI()->notorm->user->max('id');  //獲取這個(gè)key中最大的值
  return DI()->notorm->user->min('id');  //獲取這個(gè)key中最小的值
  return DI()->notorm->user->count();    //統(tǒng)計(jì)一共幾條數(shù)據(jù)

2. 事務(wù)操作

其實(shí)很大一部分使用事務(wù)的目的是應(yīng)為害怕并發(fā)的情況下導(dǎo)致,對(duì)數(shù)據(jù)庫(kù)造成重復(fù)的操作,比如如下場(chǎng)景:

應(yīng)用審核,有兩個(gè)管理者對(duì)同一個(gè)應(yīng)用審核,一個(gè)成功一個(gè)失敗,然后是同時(shí)請(qǐng)求過(guò)來(lái)的,一起到了查詢應(yīng)用狀態(tài)發(fā)現(xiàn)都是未審核,然后都去進(jìn)行了審核操作,這個(gè)時(shí)候兩個(gè)操作返回的都是審核成功,但是有一個(gè)人會(huì)看到審核狀態(tài)和自己的審核結(jié)果不同,這個(gè)就是問(wèn)題了,大部分解決此類問(wèn)題時(shí)都會(huì)考慮到使用數(shù)據(jù)庫(kù)事務(wù)操作,其實(shí)對(duì)于事務(wù)操作我的建議是能不用盡量不要使用,我簡(jiǎn)單聊一下我的幾個(gè)觀點(diǎn)

  1. 是否真的那么重要,對(duì)于上面的問(wèn)題也許乍一看上去感覺,這樣怎么可以呢,但是仔細(xì)想一想,這兩個(gè)操作都是屬于我們管理者的正常的操作,真正對(duì)于業(yè)務(wù)來(lái)說(shuō)我認(rèn)為是沒(méi)有問(wèn)題的,當(dāng)然這是因?yàn)橛绊懖淮?如果是付款,一個(gè)訂單從兩個(gè)地方同時(shí)付款然后都發(fā)現(xiàn)是未付款,然后都進(jìn)行了付款,這種業(yè)務(wù)就必須有處理方式了,所以是否使用事務(wù)要看業(yè)務(wù)是否非常需求

  2. 概率是怎么樣的,對(duì)于一個(gè)程序來(lái)說(shuō),兩條請(qǐng)求剛好通過(guò)了查詢過(guò)程,一同到了修改的時(shí)候,不管是什么場(chǎng)景發(fā)生這種并發(fā)沖突的可能性是極其微小的,我覺得幾乎可以忽略(當(dāng)然前提是重要性沒(méi)有那么的高,我們不能以偏概全)

  3. 曲線救國(guó)其實(shí)我們可以使用其他方式避免這種問(wèn)題,我們可以把我們需要驗(yàn)證條件加入到Update的條件中這樣兩條語(yǔ)句總歸會(huì)有一條語(yǔ)句執(zhí)行失敗

那么我們使用notorm中解決此類需要用到事務(wù)的問(wèn)題呢

notorm提供了常規(guī)的事務(wù)操作如下

 //第一步:先指定待進(jìn)行事務(wù)的數(shù)據(jù)庫(kù)(通過(guò)獲取一個(gè)notorm表實(shí)例來(lái)指定;否則會(huì)提示:PDO There is no active transaction)
 $user = DI()->notorm->user;
 //第二步:開啟事務(wù)開關(guān)(此開關(guān)會(huì)將當(dāng)前全部打開的數(shù)據(jù)庫(kù)都進(jìn)行此設(shè)置)
 DI()->notorm->transaction = 'BEGIN';

 //第三步:進(jìn)行數(shù)據(jù)庫(kù)操作
 $user->insert(array('name' => 'test3',));
 $user->insert(array('name' => 'test4',));

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

還有一種處理方式就是在操作之前進(jìn)行l(wèi)ock鎖表

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

這兩種方式大家可以自行取舍

注:在phalapiV1.31版本后有自帶提供事務(wù)操作可參考文檔

3. 總結(jié)

在本小節(jié)中,對(duì)于notorm之中的一些特別的封裝函數(shù)進(jìn)行了一系列的介紹,以及對(duì)于事務(wù)提出了我的看法以及觀點(diǎn),和使用notorm的解決方案,希望看了這篇教程的童鞋對(duì)你的日常開發(fā)有所幫助

注:筆者能力有限有說(shuō)的不對(duì)的地方希望大家能夠指出,也希望多多交流!

官網(wǎng)QQ交流群:421032344 歡迎大家的加入!

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)