在使用php的PDO擴展的時候發現的一個問題,在事務開啓以後,若是php與mysql之間的鏈接斷開了,會致使php直接記錄一個warning的異常,而不是直接拋出一個Exceptionphp
流程以下:mysql
/** * 一個用戶財產變動的場景下 */ try { // 1. 開啓事務 /** * 2. 變動用戶財產,增長財產變動的流水記錄 */ // 3. 提交事務 } catch (\Exception $e) { // 4. 回滾事務 // 5. 記錯誤日誌 // 6. 拋出異常 } // 7. 發佈用戶財產變動的廣播
以上的操做能夠簡單的分紅五類,在之前個人認知當中,操做事務的大體流程就是上面的樣子,沒有異常拋出則事務就是提交成功了的
可是直到有一天數據庫異常,有一個事務已經開啓了,處在上面的1-2的過程中,數據庫直接掛掉,那麼在步驟3提交事務的時候會直接出現一個warning
級別的錯誤,"SQLSTATE[HY000]: General error: 2006 MySQL server has gone away" ,
沒有捕獲到異常
因此在步驟7的後續步驟中,其餘業務方拿到了那條沒有提交的流水id並進行了統計,可是實際上用戶的財產並無增長。從而致使了問題sql
百思不得其解的時候去看了下文檔,發現了一個歷史遺留好久的bug:https://bugs.php.net/bug.php?...數據庫
後來咱們經過臨時在事務的位置配置了set_error_handler
解決了問題.net