大家幫我看看資料庫的事務如何最佳化?

來源:互聯網
上載者:User
關鍵字 php mysql 事務

好多ORM可以捕獲異常,然後復原這樣就非常的方便,但其實我覺得還沒有解決根本問題,每一條sql,orm操作不還得自己判斷是否成功嗎,並且ORM也不規範,有時執行失敗拋錯,有時又返回false,真是搞不懂,每一步都要自己判斷復原,真是崩潰了,每一步操作都要判斷結果,復原,真是崩潰了,真是崩潰了,真是崩潰了,真是崩潰了,真是崩潰了,真是崩潰了!

回複內容:

好多ORM可以捕獲異常,然後復原這樣就非常的方便,但其實我覺得還沒有解決根本問題,每一條sql,orm操作不還得自己判斷是否成功嗎,並且ORM也不規範,有時執行失敗拋錯,有時又返回false,真是搞不懂,每一步都要自己判斷復原,真是崩潰了,每一步操作都要判斷結果,復原,真是崩潰了,真是崩潰了,真是崩潰了,真是崩潰了,真是崩潰了,真是崩潰了!

我覺得是你自己的問題...你想想看M('Shop')->find($final_shop_id))這種語句有什麼需要rollback的嗎?查詢又不是修改資料對不對,你不執行rollback會產生髒資料嗎?
所以正確方式是在你$this->create || !$this->save之前開啟事務,然後驗證是否成功從而考慮是否觸發rollback,是不是瞬間簡化了?
另外,從核心邏輯上來說,只要你不執行commit,那麼當這個php進程結束之後什麼都不會改變,會自動rollback的,但是明文的rollback是好習慣,可以提高代碼的可讀性,應改堅持。

補充回答:
查詢語句和資料庫結構修改語言是不接受交易管理的,同時事務開啟會鎖定當前的mysql進程,因此應該盡量晚的開啟並儘快的結束一個事務,尤其是使用了長串連或者串連池的時候。

針對評論的補充:
我一般會這樣做:

class Model {    /**     * 最後發生的錯誤的提示資訊     */    protected $_error = false;    protected function _setError($error) {        $this->_error = $error;        return false;    }    public function getError($emptyError = true) {        $error = $this->_error;        if ($emptyError) $this->_error = false;        return $error;    }    public function example(param1, param2...) {        if (false) {            return $this->_setError('Your message or translate key');        }        ...        //Core logic if all parameters is valid        $this->beginTrans();        try {            //update, insert, delete data            ...        } catch (\Exception $e) {            $this->rollback();            return $this->_setError($e->getError());        }        return $this->commit();    }    }

其實這裡你完全可使用 try catch,代碼如下:

public function final_shop_order($final_shop_id, $order_id){    try {        $this->startTrans();                if (!$final_shop_info = M('Shop')->find($final_shop_id)) {            throw new \Exception('Your are message');            }                if (.....) {            throw new \Exception('Your are message');         }                ......                $this->commit();        return true;        } catch (\Exception $e) {        $this->rollback();        return false;    }    }

代碼風格問題而已,完全可以使用do...while(0)在中間出錯時候設定標誌位和errstr然後break,然後在最後根據傳回值,判斷是commit還是rollback

  • 相關文章

    聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.