laravel中设置数据库读写分离后强制使用主库查询
背景
在项目比较火爆,QPS比较高时,可以设置读写分离来扩容数据库,减少数据库的压力,但是有些业务可能对数据一致性要求比较高,比如支付。
当支付成功时,再去查询订单状态时,如果查询走的从库,如果出现主从延迟,就会发现订单还是未支付状态,就会给用户带来很大困扰,在laravel或者lumen项目中如何设置某个业务强制主库查询呢?现在我们介绍几种方法。
使用model强制获取主库数据
UserModel::onWriteConnect()->get();
使用 DB 方法获取主库数据
方法一:
$sql = 'select * from user'; DB::select($sql, [], false);
方法二:
DB::table('user')->lock()->get();
方法三:
'write' => [ 'driver' => 'mysql', 'host' => env('DB_WRITE_HOST', 'localhost'), 'database' => env('DB_DATABASE', 'forge'), 'username' => env('DB_USERNAME', 'forge'), 'password' => env('DB_PASSWORD', ''), 'charset' => 'utf8', 'collation' => 'utf8_unicode_ci', 'prefix' => '', 'strict' => false, ], #手动链接主库查询 DB::connection('write')->table('a')->get();
方法四(仅供参考):
$pdo = DB::connection()->getPdo(); $data=DB::connection()->setPdo($pdo)->table('user')->get();
方法五:
$sql = 'select * from user'; DB::selectFromWriteConnection($sql);