摘要:第二沒(méi)有記錄日志的行為,即使出了問(wèn)題也不容易排除。異常錯(cuò)誤然后回到如何傳參的問(wèn)題,我們可以使用閉包,貼一段偽代碼,如下執(zhí)行事務(wù)業(yè)務(wù)代碼大功告成,代碼看起來(lái)有沒(méi)有更好看呢如有問(wèn)題,歡迎指教。
在控制器中執(zhí)行事務(wù)的時(shí)候,一般的代碼如下:
$transaction = Yii::$app->db->beginTransaction(); try { //一些業(yè)務(wù)代碼 $transaction->commit(); } catch (Exception $e) { $transaction->rollBack(); throw $e; }
于是我在想,這個(gè)代碼結(jié)構(gòu),只有//一些業(yè)務(wù)代碼 這一部分是不一樣,卻要重復(fù)很多遍,這一不是很冗余嗎? 而且 不!好!看!,于是我試著尋找解決方法,一開(kāi)始在stackflow找到一個(gè)類(lèi)似的提問(wèn),有方案是在model里做封裝,但是這樣做有一定問(wèn)題,如產(chǎn)生嵌套事務(wù)等,有興趣的可以點(diǎn)擊這里查看該問(wèn)答。
我們的Yii框架給出了一個(gè)方法transaction,乍一看好像不能解決傳參的問(wèn)題,我們先不管,往下看,該方法調(diào)用方式如下:
Yii::$app->db->transaction(function() { //一些業(yè)務(wù)代碼 });
我們來(lái)看一下這個(gè)方法的源碼
/** * Executes callback provided in a transaction. * * @param callable $callback a valid PHP callback that performs the job. Accepts connection instance as parameter. * @param string|null $isolationLevel The isolation level to use for this transaction. * See [[Transaction::begin()]] for details. * @throws Exception|Throwable if there is any exception during query. In this case the transaction will be rolled back. * @return mixed result of callback function */ public function transaction(callable $callback, $isolationLevel = null) { $transaction = $this->beginTransaction($isolationLevel); $level = $transaction->level; try { $result = call_user_func($callback, $this); if ($transaction->isActive && $transaction->level === $level) { $transaction->commit(); } } catch (Exception $e) { $this->rollbackTransactionOnLevel($transaction, $level); throw $e; } catch (Throwable $e) { $this->rollbackTransactionOnLevel($transaction, $level); throw $e; } return $result; }
這個(gè)方法接受一個(gè)回調(diào)函數(shù)和事務(wù)的隔離級(jí)別,
從這里我們看出,這個(gè)方法雖然解決重復(fù)代碼,卻還有幾個(gè)問(wèn)題沒(méi)有解決:
第一,這個(gè)方法拋出的異常我們需要在接收外面處理,我們不可能直接拋出,這樣對(duì)客戶端很不友好。
第二:沒(méi)有記錄日志的行為,即使出了問(wèn)題也不容易排除。
第三:其實(shí)還是第一個(gè)問(wèn)題,如果我們需要對(duì)每個(gè)異常做處理,在transaction方法外再嵌套一層try...catch...,那么和沒(méi)有封裝好像沒(méi)什么區(qū)別?
根據(jù)方法可擴(kuò)展不可修改的原則,我們應(yīng)該在自己公共方法里對(duì)這個(gè)方法進(jìn)行重載,重載代碼如下:
public static function TransactionExecute(callable $function,$level=null) { try{ Yii::$app->db->transaction($function,$level); }catch (Exception $e){ //記錄日志 Yii::error($e->getMessage()); //這里可以理解成拋出自定義的異常類(lèi)。 (new self())->returnWayTip(1004, "trans異常錯(cuò)誤"); } }
然后回到如何傳參的問(wèn)題,我們可以使用閉包,貼一段偽代碼,如下:
//執(zhí)行事務(wù) PublicFunction::TransactionExecute(function () use ($token_reward, $reward_info) { //業(yè)務(wù)代碼 $token_reward->save(0); MsgHelper::send($reward_info["post_id"], MsgHelper::SOMEONE_FINISH_REWARD, $reward_info); });
大功告成,代碼看起來(lái)有沒(méi)有更好看呢?
如有問(wèn)題,歡迎指教。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/29233.html
摘要:學(xué)編程真的不是一件容易的事不管你多喜歡或是多會(huì)編程,在學(xué)習(xí)和解決問(wèn)題上總會(huì)碰到障礙。熟練掌握核心內(nèi)容,特別是和多線程初步具備面向?qū)ο笤O(shè)計(jì)和編程的能力掌握基本的優(yōu)化策略。 學(xué)Java編程真的不是一件容易的事,不管你多喜歡或是多會(huì)Java編程,在學(xué)習(xí)和解決問(wèn)題上總會(huì)碰到障礙。工作的時(shí)間越久就越能明白這個(gè)道理。不過(guò)這倒是一個(gè)讓人進(jìn)步的機(jī)會(huì),因?yàn)槟阋恢辈粩嗟膶W(xué)習(xí)才能很好的解決你面前的難題...
摘要:多入口模式,多入口分為后臺(tái)前端,微信,其他或接口對(duì)接,不同的業(yè)務(wù)不同的設(shè)備進(jìn)入不同的入口。對(duì)接微信公眾號(hào),使用了一款優(yōu)秀的微信非官方,系統(tǒng)內(nèi)已集成了該,調(diào)用方式會(huì)在文檔說(shuō)明,也可直接看其文檔進(jìn)入深入開(kāi)發(fā)。 RageFrame 為二次開(kāi)發(fā)而生,讓開(kāi)發(fā)變得更簡(jiǎn)單。 前言 RageFrame項(xiàng)目創(chuàng)建于2016年4月16日,基于Yii2框架開(kāi)發(fā)的應(yīng)用開(kāi)發(fā)引擎,目前正在成長(zhǎng)中,目的是為了集成更多...
摘要:目的分析通過(guò)實(shí)戰(zhàn),分享多模型與事務(wù)的簡(jiǎn)單用法。多模型驗(yàn)證數(shù)據(jù)全部通過(guò)后才能保存數(shù)據(jù),否則保存失敗事務(wù)保存數(shù)據(jù)遇到異常會(huì)把原來(lái)已保存的數(shù)據(jù)撤銷(xiāo)。多模型表與表之間無(wú)聯(lián)系,事務(wù)表與表之間要有聯(lián)系。相關(guān)資料多模型的復(fù)合表單事務(wù)事務(wù)什么情況使用 前言 Yii2的多模型與事務(wù)平時(shí)用的也挺多的,但是網(wǎng)上現(xiàn)有的資源不多,為此我覺(jué)得有必要做個(gè)總結(jié)與分享,雷鋒同志的一貫作風(fēng),不做解釋。在利用大伙喝咖啡的時(shí)...
摘要:目的分析通過(guò)實(shí)戰(zhàn),分享多模型與事務(wù)的簡(jiǎn)單用法。多模型驗(yàn)證數(shù)據(jù)全部通過(guò)后才能保存數(shù)據(jù),否則保存失敗事務(wù)保存數(shù)據(jù)遇到異常會(huì)把原來(lái)已保存的數(shù)據(jù)撤銷(xiāo)。多模型表與表之間無(wú)聯(lián)系,事務(wù)表與表之間要有聯(lián)系。相關(guān)資料多模型的復(fù)合表單事務(wù)事務(wù)什么情況使用 前言 Yii2的多模型與事務(wù)平時(shí)用的也挺多的,但是網(wǎng)上現(xiàn)有的資源不多,為此我覺(jué)得有必要做個(gè)總結(jié)與分享,雷鋒同志的一貫作風(fēng),不做解釋。在利用大伙喝咖啡的時(shí)...
摘要:下面圍繞的這樣的目的,即左右知乎網(wǎng)頁(yè)上屏幕截圖功能的實(shí)現(xiàn)前端掘金背景最近注意到知乎的屏幕截圖反饋功能,感覺(jué)非常不錯(cuò)。正如你期望的,文中的闖關(guān)記之垃圾回收和內(nèi)存管理前端掘金題圖來(lái)源,授權(quán)基于協(xié)議。 微信小程序?qū)崙?zhàn)學(xué)習(xí) 起手式 DEMO 仿肯德基 - 前端 - 掘金小程序?大場(chǎng)景? 微信小程序本質(zhì)上來(lái)說(shuō)就是一個(gè) HTML 5(移動(dòng)網(wǎng)頁(yè)) 應(yīng)用,用view、scoll-view代替了div標(biāo)...
閱讀 485·2023-04-25 17:26
閱讀 1504·2021-08-05 09:58
閱讀 1970·2019-08-30 13:17
閱讀 953·2019-08-28 17:52
閱讀 1069·2019-08-26 18:27
閱讀 1424·2019-08-26 14:05
閱讀 3622·2019-08-26 14:05
閱讀 1597·2019-08-26 10:45