TP6.0 数据库读写分离数据脏读?关键业务强制指定主库连接

小瑶大大_4034

小瑶大大_4034

2026-07-16

427人浏览

原创

读写分离导致主从延迟引发脏读,tp6.0需强制主库查询:①确认deploy=1、rw_separate=true、read为二维数组、write为一维数组;②用->master(true)、db::connect('master_db')或事务内查询强制主库。

tp6.0 数据库读写分离数据脏读?关键业务强制指定主库连接

当用户提交订单后立即查询订单状态却查不到最新数据,或管理员修改配置后前端刷新仍显示旧值,这类问题往往不是代码逻辑错误,而是读写分离导致的主从延迟引发的数据脏读。TP6.0 默认将 select 类操作路由至从库,但关键业务场景下必须绕过自动路由,强制走主库连接。

确认当前读写分离是否已启用

打开 config/database.php 文件,定位到 connections['mysql'] 配置块,检查是否存在且同时满足以下四项:

① 【'deploy' => 1】 —— 必须为整数 1,写成 true 或 "1" 均无效;

② 【'rw_separate' => true】 —— 必须为布尔 true,设为 1 或字符串会静默失效;

③ 'read' 是二维数组(如 [['hostname' => 's1'], ['hostname' => 's2']]),一维写法不报错但完全忽略;

④ 'write' 是单维数组(如 ['hostname' => 'm1', 'database' => 'shop']),二维写法启动即抛异常。

关键业务查询强制走主库的三种方法

方法一:链式调用 ->master(true)

在模型或 Db 查询中直接追加该方法,例如:OrderModel::where('id', $id)->master(true)->find()。这会临时锁定本次查询使用主库连接,不影响后续其他查询的路由逻辑。

ThinkPHP5.1企业站点快速开发-源码课件
ThinkPHP5.1企业站点快速开发-源码课件

ThinkPHP5.1企业站点快速开发

下载

方法二:使用 Db::connect() 指定主库连接名

若已在 connections 中定义了独立主库连接(如名为 'master_db'),可显式调用:Db::connect('master_db')->table('orders')->where('id', $id)->find()。注意:此方式绕过所有读写分离机制,【必须确保该连接配置完整且未启用 rw_separate】,否则可能意外回退到默认分离逻辑。

方法三:事务内自动强制主库(无需额外代码)

只要包裹在 Db::transaction(function () { ... }) 内的任何查询(包括 select()、count()、value()),TP6.0 一律发往主库。这是框架内置行为,无需手动干预,但需注意事务范围不可过大——长事务会持续占用主库连接并放大延迟风险。

避免脏读的典型场景与操作路径

第一步:用户提交表单 → 后端执行 Db::name('user_config')->insert($data);

第二步:立即查询刚写入的配置 → 必须用 Db::name('user_config')->master(true)->where('user_id', $uid)->find();

第三步:若需批量验证写入结果 → 改用 Db::transaction 包裹 insert + select,而非分两次独立请求;

这一步不能省略:任何含 FOR UPDATE 或 LOCK IN SHARE MODE 的原生 SQL,即使不在事务中,也会被 TP6 自动识别并强制路由至主库——但前提是 SQL 字符串中必须包含这些关键字,大小写敏感,空格不可省略。

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

thinkphp

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据库三范式
数据库三范式

数据库三范式是一种设计规范,用于规范化关系型数据库中的数据结构,它通过消除冗余数据、提高数据库性能和数据一致性,提供了一种有效的数据库设计方法。本专题提供数据库三范式相关的文章、下载和课程。

2023.06.29

2685

3

如何删除数据库
如何删除数据库

删除数据库是指在MySQL中完全移除一个数据库及其所包含的所有数据和结构,作用包括:1、释放存储空间;2、确保数据的安全性;3、提高数据库的整体性能,加速查询和操作的执行速度。尽管删除数据库具有一些好处,但在执行任何删除操作之前,务必谨慎操作,并备份重要的数据。删除数据库将永久性地删除所有相关数据和结构,无法回滚。

2023.08.14

3901

10

vb怎么连接数据库
vb怎么连接数据库

在VB中,连接数据库通常使用ADO(ActiveX 数据对象)或 DAO(Data Access Objects)这两个技术来实现:1、引入ADO库;2、创建ADO连接对象;3、配置连接字符串;4、打开连接;5、执行SQL语句;6、处理查询结果;7、关闭连接即可。

2023.08.31

2951

3

MySQL恢复数据库
MySQL恢复数据库

MySQL恢复数据库的方法有使用物理备份恢复、使用逻辑备份恢复、使用二进制日志恢复和使用数据库复制进行恢复等。本专题为大家提供MySQL数据库相关的文章、下载、课程内容,供大家免费下载体验。

2023.09.05

947

5

vb中怎么连接access数据库
vb中怎么连接access数据库

vb中连接access数据库的步骤包括引用必要的命名空间、创建连接字符串、创建连接对象、打开连接、执行SQL语句和关闭连接。本专题为大家提供连接access数据库相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.09

2607

5

数据库对象名无效怎么解决
数据库对象名无效怎么解决

数据库对象名无效解决办法:1、检查使用的对象名是否正确,确保没有拼写错误;2、检查数据库中是否已存在具有相同名称的对象,如果是,请更改对象名为一个不同的名称,然后重新创建;3、确保在连接数据库时使用了正确的用户名、密码和数据库名称;4、尝试重启数据库服务,然后再次尝试创建或使用对象;5、尝试更新驱动程序,然后再次尝试创建或使用对象。

2023.10.16

2607

4

vb连接access数据库的方法
vb连接access数据库的方法

vb连接access数据库方法:1、使用ADO连接,首先导入System.Data.OleDb模块,然后定义一个连接字符串,接着创建一个OleDbConnection对象并使用Open() 方法打开连接;2、使用DAO连接,首先导入 Microsoft.Jet.OLEDB模块,然后定义一个连接字符串,接着创建一个JetConnection对象并使用Open()方法打开连接即可。

2023.10.16

2873

3

vb连接数据库的方法
vb连接数据库的方法

vb连接数据库的方法有使用ADO对象库、使用OLEDB数据提供程序、使用ODBC数据源等。详细介绍:1、使用ADO对象库方法,ADO是一种用于访问数据库的COM组件,可以通过ADO连接数据库并执行SQL语句。可以使用ADODB.Connection对象来建立与数据库的连接,然后使用ADODB.Recordset对象来执行查询和操作数据;2、使用OLEDB数据提供程序方法等等。

2023.10.19

2421

3

mdf文件导入数据库的方法
mdf文件导入数据库的方法

mdf文件导入数据库的方法有使用SQL Server Management Studio、使用SQL Server命令行工具、使用SQL Server Integration Services等方法。想了解更多mdf文件导入数据库的方法的相关内容,可以阅读本专题下面的文章。

2023.10.23

2593

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
ThinkPHP6.x 微实战--十天技能课堂
ThinkPHP6.x 微实战--十天技能课堂

共26课时 | 2.5万人学习

ThinkPHP6.x API接口--十天技能课堂
ThinkPHP6.x API接口--十天技能课堂

共14课时 | 1.5万人学习