欢迎来到曹鸿源的个人站点
希望我们可以相互学习,谢谢!^o^

       

Yii2.0 主从数据库,强制读取主库数据内容的方法

 2019-10-26 16:50:16   {{zan}}   1   153 

项目数据库配置主从库虽然有很多优点,但是写入主库的数据要同步到从库,还是需要一定的时间的,特别是主库在海外,从库在国内的情况。

当需要马上获取读取刚写入主库的 id 的时候,就只能直接读取主库了。

下面就总结了一个可以读取主库的方法:


首先你要配置了主从库。如果没有配置可以看下 Yii2.0 主从库的配置方法 配置起来也很简单。

如下图我们配置好了主库从库:

主库:

image.png

从库:

image.png

正常做查询操作的时候是只能读取从库的比如:

# 正常读取,读取从库内容
echo '从库 slave 的内容:<br/>';
$slave_users = User::find()->asArray()->one();
var_export($slave_users);

有一点需要说前面:Yii2.0 配置主从库有两种:一是一主库多从库,二是多主库多从库。

下面写的仅适用第二种:多主库多从库!

打印结果如下:

image.png

下面是可以读取主库的方法:

1、单独指定指定主库:

$master_db = Yii::$app->db->master;
$master_users = $master_db->createCommand("select * from user")->queryOne();
var_export($master_users);

# 打印结果:
# array ( 'id' => '1', 'username' => 'master_user', )

这种只能写原生 SQL 不可以使用框架的活动记录去查询;


2、使用 userMaster() 函数直接读取主库数据:

$master_users = Yii::$app->db->useMaster(function ($db) {
    return $db->createCommand("select * from user")->queryOne();
});
var_export($master_users);

# 打印结果:
# array ( 'id' => '1', 'username' => 'master_user', )

这种方法可以使用 Yii2.0 框架的活动记录(Active Record)去查询如下:

$master_users = Yii::$app->db->useMaster(function () {
    return User::find()->asArray()->one();
});
var_export($master_users);

# 打印结果:
# array ( 'id' => '1', 'username' => 'master_user', )


3、可以明确地将 Yii::$app->db->enableSlaves 设置为 false 来将所有的读操作指向主库连接:

Yii::$app->db->enableSlaves = false;
$master_users = User::find()->asArray()->one();
var_export($master_users);

# 打印结果:
# array ( 'id' => '1', 'username' => 'master_user', )

有个地方需要注意的,当 Yii::$app->db->enableSlaves = false; 后再执行查询操作都将是查询主库,如果再想继续查询从库,可以手动打开从库,如下:

echo '主库 master 的内容:<br/>';
Yii::$app->db->enableSlaves = false;
$master_users = User::find()->asArray()->one();
var_export($master_users);

echo '<br/>';

echo '从库 slave 的内容:<br/>';
Yii::$app->db->enableSlaves = true;
$slave_users = User::find()->asArray()->one();
var_export($slave_users);

# 打印结果:
# 主库 master 的内容:
# array ( 'id' => '1', 'username' => 'master_user', )
# 从库 slave 的内容:
# array ( 'id' => '1', 'username' => 'slave_user', )


4、再执行事务的时候,事务里的查询操作默认都是主库,即使你打开了从库,如第三种方法,也是读取的主库:

$db = Yii::$app->db;
$transaction = $db->beginTransaction();
try {
    $master_users = User::find()->asArray()->one();
    var_export($master_users);
    
    echo '<br/>';
    
    Yii::$app->db->enableSlaves = true;
    $slave_users = User::find()->asArray()->one();
    var_export($slave_users);

    $transaction->commit();
} catch(\Exception $e) {
    $transaction->rollBack();
    throw $e;
}

# 打印结果:
# array ( 'id' => '1', 'username' => 'master_user', )
# array ( 'id' => '1', 'username' => 'master_user', )


完毕,欢迎补充指正。

本文链接地址,转载请标注:https://caohongyuan.cn/article/133

(邮箱不会公开,只会做回复通知用) 提交 清空 {{comment.content}}
Re:{{response.content}}