各位大神們 入門PHP程式員求協助
Yii事物
官方寫法:
$transaction=$connection->beginTransaction(); try { $connection->createCommand($sql1)->execute(); $connection->createCommand($sql2)->execute(); //.... other SQL executions $transaction->commit(); } catch(Exception $e) { $transaction->rollBack(); }
自己封裝的寫法:
說明:$this->getDb()是父類通過Yii 擷取到的$connection對象
我只是在執行個體化的時候把$connection對象傳到Db層,然後Db層進行增刪改查等操作
但是在DB層的時候,執行excuse()方法時候直接插入到資料庫了,事物沒起作用,求解!!!
service層
public function addCourseRecommend($courseRecommend,$payWayArray) { try{ $connection=$this->getDb(); $transaction=$connection->beginTransaction(); $this->courseRecommendDb= new CourseRecommendDb($connection); $this->payWayDb=new PayWayDb($connection); $this->courseRecommendDb->addCourseRecommend($courseRecommend); foreach($payWayArray as $tempPayWay) { $this->payWayDb->addPayWay($tempPayWay); $tempPayWayRecommend =new PayWayRecommend(); $this->payWayDb->addPayWayRecommend($tempPayWayRecommend); } $this->commit($transaction); }catch (Exception $e){ $this->rollback($transaction); $this->closeLink(); throw $e; } $this->closeLink(); }
回複討論(解決方案)
坐等回複
人呢,人呢。。。。。
但不明白你的代碼在做什麼
但需要注意的是:事務只在同一串連中有效
Yii 的資料庫是基於 PDO 的,每次 new PDO 都會產生新的串連(這一點是與分立函數的資料庫擴充是不同的)
但不明白你的代碼在做什麼
但需要注意的是:事務只在同一串連中有效
Yii 的資料庫是基於 PDO 的,每次 new PDO 都會產生新的串連(這一點是與分立函數的資料庫擴充是不同的)
謝謝版主,已經解決。
我這樣的做法是為了在service中調用多個業務的DB來實現事物。想法應該是沒錯的,具體錯誤已經解決了。
經過排查之後找到是資料庫引擎問題,我要操作那個表類型不知道怎麼變成 MyISAM 了。
MyISAM 和 InnoDB 講解 InnoDB和MyISAM是許多人在使用MySQL時最常用的兩個表類型,這兩個表類型各有優劣,視具體應用而定。基本的差別為:MyISAM類型不支援交易處理等進階處理,而InnoDB類型支援。MyISAM類型的表強調的是效能,其執行數度比InnoDB類型更快。
折騰了一上午,剛開始也考慮到可能是資料庫引擎問題,但是可能性比較小就忽略了,大家以後還是要細心啊!!!!