gpt4 book ai didi

mysql - 打开第二个数据库连接时外键锁定事务超时

转载 作者:可可西里 更新时间:2023-11-01 08:45:10 25 4
gpt4 key购买 nike

我遇到了一个问题,涉及一个类中的数据库事务,由于事务中打开了辅助数据库连接而超时;当我添加外键约束时,问题开始出现。并且,测试使用:

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();

}}}

最佳答案

一个线程应该(通常)只有一个到数据库的连接。所以我推荐以下模式之一:

方案 A:将单个 $db 传递给所有类:

$db = new PDO(...);
$my_obj = new My_Class($db); -- $db is saved in $this->db for use within the methods of My_Class.

B 计划:带有 getter 方法的单例 Db 类:

// Singleton (of sorts)
class Db
{
private static $db;
function __construct()
{
self::$db = new PDO(...);
// A variant would include "lazy" instantiation of self::$Db.
}
function Get_Db() { return self::$db; } // All calls get the same `db`
}
class My_class
{
function My_Method()
{
$db = Db::Get_Db();
$db->...
}
}

new Db(); // one time call at start of program

很少需要在一个程序中有两个数据库连接。计划 A 很容易做到这一点。 (但是看看你是否可以避免它——你现在正因此而陷入困境。)

关于mysql - 打开第二个数据库连接时外键锁定事务超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31089317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com