PDO擴展PDO::ATTR_AUTOCOMMIT 出坑記

問題描述

我本身以swoole擴展爲基礎,封裝了一個異步任務服務器框架,數據庫操做使用pdo擴展,可是在插入數據的時候,出現了異常狀況,具體情況以下:mysql

  • MyISAM 表引擎的insert正常插入,沒有問題程序員

  • Innodb表引擎查詢均可以的,可是插入失敗,出現回滾現象,auto_increment字段變化,表的rows變化,lastInsertId正常返回sql

解決過程

  • 監控mysql日誌,查看狀態
    進入mysql命令行,查看mysql的general-log狀態數據庫

show global variables like "%genera%";

若是沒有開啓,執行以下命令服務器

;general_log_file_path修改成本身象牙iode
set global general_log_file="general_log_file_path";
set global general_log=on

而後監控日誌,發現insert語句發送到mysql端了swoole

  • 查看innodb engine狀態
    懷疑是否是死鎖了,查看innodb 的狀態框架

show engine innodb status;

沒有發現異常
到這裏,已經有些抓狂了
而後google,各類嘗試,都不得要領異步

柳暗花明

糾結了挺長時間,後來看到有人說innodb引擎把insert看成一個事物處理,瞬間想到了一個問題,是否是pdo擴展裏面,沒有自動提交?
直接寫了個簡單的mysql pdo 鏈接數據庫,而且插入數據到innodb表裏面,結果沒有任何問題,成功了,而後我就想到pdo裏面有個參數PDO::ATTR_AUTOCOMMIT,是否是他在做怪?
使用getAttribute(PDO::ATTR_AUTOCOMMIT)) 獲取他的值,打印,發現是1,證實是自動提交事務的
而後在我封裝的框架裏面,我打印了他的值,發現是0,問題找到
那麼,在插入的時候,如何提交事務?google

  • 鏈接數據庫的時候,options裏面設置 PDO::ATTR_AUTOCOMMIT 爲 1命令行

  • 插入操做的時候,本身執行commit,顯式的完成一次事務,我採用了這個方法

遺留問題是,一樣的PHP版本,爲啥單獨的鏈接 PDO::ATTR_AUTOCOMMIT爲1 ,在啓動的swoole-httpserer裏面是0,我沒有繼續深刻。

總結

解決問題必定要鍥而不捨,不要放棄,那麼問題最終會得到比較理想的處理結果

另外要注意方法,嘗試不一樣的思路,我就是一直沒有想到多是事務自動提交致使的,以致於浪費了不少時間

最後,但願goolge不要被封鎖的這麼嚴重,媽的,百度 必應搜索結果徹底無法和google比,程序員,離不開google

相關文章
相關標籤/搜索