99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

notrom進階以及事務操作

2018-11-21 21:29 更新

PHALAPI-進階篇4(NOTROM進階以及事務操作)

前言

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

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

附上:

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

官網地址: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');

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

嗯!是在返回的時候把在之前定義的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. 事務操作

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

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

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

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

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

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

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

 //第一步:先指定待進行事務的數據庫(通過獲取一個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';

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

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

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

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

3. 總結

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

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

官網QQ交流群:421032344 歡迎大家的加入!

以上內容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號