我本身以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