我遇到一个问题,涉及一个类中的数据库事务,该事务由于在事务中打开辅助数据库连接而超时;当我添加外键约束时,问题开始出现。并且,测试使用:
SET foreign_key_checks = 0;
我已经能够证实这一点。
我的数据库类如下所示(我放弃了所有方法):
class Db {
function __construct($config) {
$this->config = $config;
}
private function connect($config) {$dsn = 'mysql:host=' . $config['host'] . ';dbname=' . $config['dbname'] . ';charset=utf8';
$options = array(
// PDO::ATTR_PERSISTENT => true,
PDO::ATTR_EMULATE_PREPARES => false,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$dbh = new PDO($dsn, $config['username'], $config['password'], $options);
$dbh->exec("SET NAMES utf8;");
return $dbh;
}
}
我的模型如下所示:
class Model {
function __construct() {
$this->db = new Db(array('host'=>DB_HOST,'dbname'=>DB_NAME,'username'=>DB_USERNAME,'password'=>DB_PASSWORD));
}
}
下面的代码执行一些逻辑,然后插入到 Question_orders 表中: Question_orders 有一个列 Question_id,带有外键索引,该索引引用父表 questions;我认为问题是 Assessment_Question_Orders 扩展了模型并创建了一个新的数据库连接?任何关于如何维护交易和外键方面的想法将不胜感激。
class This_Is_A_Problem extends Model() {
public function __construct() {
parent::construct();
}
public function problemFunction() {
/*variable init code left out*/
$this->db->beginTransaction();
$db_result = false;
try {
$db_result = $this->db->insert('questions', $questions_data);
$new_insert_id = $this->db->lastInsertId();
$assessment_question_orders = new Assessment_Question_Orders();
$question_number = $assessment_question_orders->insertSingleQuestionOrder($module_id, $new_insert_id);
$db_result = $this->db->commit();
}
} catch (PDOException $e) {
$this->db->rollBack();
}}}