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

2018-11-21 21:29 更新

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

前言

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

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

附上:

喵了個咪的博客:w-blog.cn

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

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

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

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

1.1 fetchPairs

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

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

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

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

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

提示:在老版本中在使用過程中 Result.php 會有一句 821行的報錯需要把

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

1.2 lock

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

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

生成的sql語句如下:

SELECT * FROM user FOR UPDATE;

1.3 加操作

在很多時候我們會用到,數(shù)據(jù)庫里面某個值+1或者是其他,我們不能在update的時候?qū)懭隺rray('key' => 'key+1')因為在解析sql的時候 key+1 會帶上引號作為一個字符串處理,當(dāng)然是有解決方法的,如下

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用于統(tǒng)計有多少同名的用戶等一些統(tǒng)計操作,或者是找出庫里面不重復(fù)的城市名

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

會獲得如下結(jié)果

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

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

  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();    //統(tǒng)計一共幾條數(shù)據(jù)

2. 事務(wù)操作

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

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

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

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

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

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

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

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

 //第三步:進(jìn)行數(shù)據(jù)庫操作
 $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é)中,對于notorm之中的一些特別的封裝函數(shù)進(jìn)行了一系列的介紹,以及對于事務(wù)提出了我的看法以及觀點(diǎn),和使用notorm的解決方案,希望看了這篇教程的童鞋對你的日常開發(fā)有所幫助

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

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

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號