PHP一个修改没有改完紧接着又查询一次,导致数据重复

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP一个修改没有改完紧接着又查询一次,导致数据重复相关的知识,希望对你有一定的参考价值。

比如我查询A表的TYPE字段为1的所有数据,假如有10000条,然后给这10000个人发送数据,发送完毕把TYPE改成2,问题来了:::如果1分钟执行一次,1分钟内只发送和修改了5000条数据,这个时候在查询就会把没发送的那5000条数据查询出来,也就是说10000个人里面有5000人收到了2次数据,如何解决这个问题,当然我可以把时间调整到10分钟,20分钟等执行完毕后在查询,但这是一个治标不治本的方法,还有什么其他方法吗?

标准的方法是锁定数据库,你开始写数据的时候就独占方式锁定表,这时候其它用户(或者同一用户的其它进程)查询数据库会报错,直到你修改完毕后再解除表锁定。

此外,还有一个更加完美一点的方法:增加TYPE字段的含义,1表示需要发送、2表示已经发送、3表示正在发送,你的程序每次只查询TYPE=1的来处理,处理之前整体修改TYPE=3(这个修改应该瞬间完成,而且一个UPDATE语句执行的时候mysql会自动锁定),然后慢慢发送和修改TYPE=2。追问

目前在修改的时候表的数据同时在不断增加着的

追答

除了之前说的新增TYPE=3表示正在发送的方法之外,还有一个靠谱的解决方案——设定信号标记:就是在发送的时候设定一个记号,发送完毕取消记号,时间还是一分钟一次,但是每次要检测是否有正在发送记号,如果存在就退出,下一分钟再来。做记号有许多方法,比如数据库建立一个表(为了加快速度可以使用内存表),只有一条记录,使用一个字段的值为0或者1来表示是否正在发送。也可以建立空文件的方法,如果检查到存在这个文件就退出,不用再连接数据库。

参考技术A 关键是你给10000个人发送数据 这个过程应该是不需要在查询的时候来做啊 你查到的人 存入缓存中 直接修改type=2 然后再缓存里去给人发送数据啊 几分钟执行一次不取决你发送数据要的时间 取决你查询需要的时间 因为这样做 就算你1分钟没发送完 再次查询 之前的10000人的TYPE已经是2了

数据库之MySQL查询去重数据

最近遇到了一个问题,当时我的第一反应是导出来,用wps的Excel表格的删除重复项的功能,简单粗暴又直接,但是没有考虑到数据量太大的情况,会导致Excel打开缓慢。这个时候就考虑有没有更方便快捷的方法,网上也查询了很多方法,但是实践出真知,还是要实践之后才能得到真相。 

 

 开始实践:

1、先创建一个拥有重复数据的表。

 方法一:使用DISTINCT过滤重复数据

1、直接查询age字段,会输出所有数据,包含重复项。

2、 DISTINCT 关键字指示 MySQL 消除重复的记录值

SELECT DISTINCT <字段名> FROM <表名>;

 可以看到消除了重复项,使用distinct可行。

使用 DISTINCT 关键字时需要注意以下几点:

DISTINCT 关键字只能在 SELECT 语句中使用。

在对一个或多个字段去重时,DISTINCT 关键字必须在所有字段的最前面。

如果 DISTINCT 关键字后有多个字段,则会对多个字段进行组合去重,也就是说,只有多个字段组合起来完全是一样的情况下才会被去重。

方法二:group by

GROUP BY 语句根据一个或多个列对结果集进行分组。在分组的列上我们可以使用 COUNT, SUM, AVG,等函数。

select 重复的字段名 from 表名  group by 重复的字段名;

group by 对age查询结果进行了分组,自动将重复的项归结为一组。

 还可以使用count函数,统计重复的数据有多少个。

方法三: row_number窗口函数

oracle等数据库中可以方便的使用row_number函数,实现分组取组内特定数据的功能。但是MySQL中并没有引入类似的函数。为了实现这一功能,需要一些特别的处理。

row_number() over (partition by <用于分组的字段名> order by <用于组内排序的字段名>)

select * from (select t.*,row_number() over(partition by t.children_id  order by t.update_time DESC) rn       
from mdm_data_authority_view_info t where t.DATA_CLASS_ID = '分类id' AND t.DATA_ROLE_ID 
IN ( '角色id', '角色id' ))              
where rn = 1;  
 

 

以上是关于PHP一个修改没有改完紧接着又查询一次,导致数据重复的主要内容,如果未能解决你的问题,请参考以下文章

数据库之MySQL查询去重数据

在docker以FPM-PHP运行php,慢日志导致的BUG分析

使用 php 只需一次地理重定向用户

java.sql.SQLException:连接是只读的。不允许导致数据修改的查询

Elasticsearch在操作数据后不能立即查询到数据

sqlserver分页去重失效