3.1.2 - 严重 - 未处理
问题: 事务开启后($model->startTrans()),数据库链接会切换到主服务器,但是在事务中做查询($model->...->select(),$model->...->find())操作时数据库会切回到从服务器,数据一致性存在问题.特别在查询并发锁($model->lock(true)...->select())时,从服务器一般只有读权限,从而导致锁操作(FOR UPDATE)失败.修改目的: 事务开启后为所有操作都应该操作主服务器
解决方案:
数据库驱动类(Mysql Mysqli)定义一个成员变量$master用于指定连主机还是从机:
private $master=false;在startTrans()方法中将$master设为true:public function startTrans() {
...
$this->master = true;
...
}在commit(),rollback()方法中将$master设为false:public function commit() {
...
$this->master = false;
...
}public function rollback() {
...
$this->master = false;
...
}在query()函数中根据$this->master的值切换主/从机:public function query($str) {
...
$this->initConnect($this->master);
...
}此BUG能如此完美的解决,得益于ThinkPHP优秀的架构,再此向ThinkPHP开发团队致敬... 