php 自加 性能,对于数据库的自增、自减心得
系統研發過程中會有很多地方涉及到自增、自減操作 如:加入版塊時,用戶版塊數自增1,版塊用戶數自增1;退出版塊時,用戶版塊數要減1,版塊用戶數也要減1
這里推薦:
1.自增可以用
2.自減不要用,而是用重新count結果的方式。這樣可以確保數據的一致性,并且,實際用戶使用過程中,自減比較少的,大多數都是自增,重新count一遍,性能并不會有多少消耗。
$map['uid']=$uid;
$map['fid']=$forum_id;
$res = self::where($map)->find();
//查看版塊關注表中是否有記錄
self::startTrans();
try{
if ($res) {
if ($res['status'] == 1) { //若有記錄并且已加入,則改為退出狀態,并將該版塊用戶數減一
$status = 0;
$now_count=self::where('fid',$forum_id)->where('status',1)->count();
ComForum::where('id', $forum_id)->setField('member_count',$now_count-1);
$forum_count=self::getForumCount($uid);
UserModel::where('uid',$uid)->setField('forum_count',$forum_count-1);
//退出版塊日志
action_log($uid,2,'退出版塊');
} else { //若有記錄并且已退出版塊,則改為加入,并將該版塊用戶數加一
$status = 1;
ComForum::where('id', $forum_id)->setInc('member_count');
UserModel::where('uid',$uid)->setInc('forum_count');
//加入版塊日志
action_log($uid,1,'加入版塊');
}
self::update(['status'=>$status],$map); //更新操作
} else { //若沒有記錄則添加加入記錄,并將該版塊用戶數加一
self::add(['uid' => $uid, 'fid' => $forum_id,'status'=>1,'create_time'=>time()]);
ComForum::where('id', $forum_id)->setInc('member_count');
UserModel::where('uid',$uid)->setInc('forum_count');
//加入版塊日志
action_log($uid,1,'加入版塊');
}
UserTaskNew::newAddToForum($uid); //加入版塊新手任務
self::commitTrans();
return true;
}catch (\Exception $e){
self::rollbackTrans();
self::setErrorInfo('操作失敗:'.self::getErrorInfo().$e->getMessage());
return false;
}
重點:關于事務中的update、setField、setInc、setDec的操作,執行失敗,也不會報exception,事務不會回滾
事務中,對于數據庫的更新操作,如果where條件查詢不到結果,更新不會被執行,這樣執行結果為失敗,但不會拋出異常,事務繼續正常向下執行。
######面對如上這種情況,該如何處理呢?有如下2中可選方案
1、保證where條件肯定能查詢到想要的數據。比如根據id查詢,id肯定存在的,不然之前就報錯了。
2、獲取執行結果,如果執行結果$res==0,說明更新操作影響了0行,那么可以調用exception('更新執行失敗');主動拋出異常,告訴事務,回滾操作,執行失敗。
注意:關于積分的自減
積分在用戶體系里面尤為特殊且很重要,對于積分,不適合重新count了,這個時候只能用自減。 那么如何保證自減操作不會出現異常呢?比如,積分制不會變負值。 這里有兩步:
1.數據庫字段設置為unsigned(非負數)
2.進行自減時,where條件里面加上score>=num(score為積分字段,num為要自減的數值)
如上兩步操作完成后,還有個問題要注意:涉及到積分變動,在外圍調用的時候都會用事務的寫法,這個時候,如果加上where條件時,雖然積分自減失敗了,但是數據庫執行是正常的,而實際情況應該是執行失敗,并回滾所有事務。那怎么辦呢?
可以考慮檢測自減操作影響的行數,如果影響行數為0,說明執行失敗,這個時候,代碼中可以加上主動拋出異常的操作,異常信息為"扣除用戶積分操作失敗!",提醒外圍進行回滾事務。
總結
以上是生活随笔為你收集整理的php 自加 性能,对于数据库的自增、自减心得的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java怎么把数组怎么放入set,如何将
- 下一篇: java 静态代码块 多线程,Java多