-
2018-04-23 15:03:57
- oracle中分页查询同时进行排序,但出现重复数据,原因是使用的排序字段的数据不是唯一的,这和oracle分页排序机制有关,不能按照分页前的顺序显示分页后的顺序,具体原理没有细看,知道的且能用大白话说明白的可以留言。
- 解决办法:oracle分页排序必须满足的2个条件:(1、sql语句中必须有排序条件;2、排序条件如果没有唯一性,那么必须在后边跟上一个唯一性的条件,比如主键)
更多相关内容 -
【日常小问题2】桌面上文件夹重复删除了之后又重复出现的问题
2020-03-03 21:43:47Author:AXYZdong 自动化专业 工科男 有一点思考,有一点想法,有一点理性 ...结果这些方法都不适用我的电脑出现的问题,尝试了很多方法,修改注册表啊等等。 最后不经意间发现我删完桌面空文件夹后,...Author:AXYZdong
自动化专业 工科男
有一点思考,有一点想法,有一点理性我最近电脑上桌面上老是有一个文件夹,里面是空的,删了之后有重复出现。
对于我这种有强迫症的人来说,无法容忍。
于是乎,我开始寻求度娘和知乎的帮助。
在上面找到了几种认可度比较高的解决方法:
结果这些方法都不适用我的电脑出现的问题,尝试了很多方法,修改注册表啊等等。最后不经意间发现我删完桌面空文件夹后,打开百度网盘,这个文件夹突然又出现了,所以我就怀疑和百度网盘有关。于是我看了看百度网盘的下载地址,刚好就是那个突然出现空文件夹的地址,之后修改了下载地址。又把百度网盘重新打开了一次,结果桌面没有出现那个空文件夹了。
总结:当你在试了百度上面大神的各种方法后,桌面上文件夹删除之后依然会出现,不妨试试我所述的方法。
找到你电脑上可以自动创建文件夹的应用(比如QQ、百度网盘等),找找那些应用的设置,看看它们把自动创建的文件夹放到电脑上的什么位置(比如百度网盘的下载地址),如果是桌面(Desktop)的话,修改自动创建文件夹的地址就可以了。如果不是桌面的话,看看其他应用有没有把自动创建的文件夹的地址设置在桌面。
如果有不懂的地方可以私信我呢!
码字不易,大家的支持就是我坚持下去的动力。点赞后不要忘了关注我哦!
-
RecyclerView中出现item重复问题的一次记录
2019-09-30 09:43:22接下来,我就得追踪下这个问题了,开始时我几乎就一口咬定是接口返回的有问题,由于前几次后端没有日志,好像之前的反馈就那么过去了,直到后面又出现一次重复笔记的问题,这次是公司内部员工出现的,于是后端也通过...问题背景
前不久我们项目中由用户反馈说遇到笔记重复的问题,而且不只一次遇到类似的反馈。
这种重复笔记总是出现的feed流的中间位置,如下示意图所示:
这个图画的有点丑,凑合看,意思大概就是这样的。
接下来,我就得追踪下这个问题了,开始时我几乎就一口咬定是接口返回的有问题,由于前几次后端没有日志,好像之前的反馈就那么过去了,直到后面又出现一次重复笔记的问题,这次是公司内部员工出现的,于是后端也通过这个抓到了相应的日志,发现返回的笔记的确没有重复的,这下跑不掉了,就是前端的问题。
问题排查
于是,我又重新梳理了下代码流程,发现有一处比较有嫌疑:
... if (...) { mItems[0] = noteItem } else { mItems.add(0, noteItem) } mAdapter.items = mItems mAdapter.notifyItemChanged(0) ...
鉴于是公司项目,我就省略掉业务逻辑了,这里的代码按照开发者的意图是当RecyclerView第一个item如果已经是noteItem这种类型的时候,我们就将这个位置item替换成最新的,如果这个位置的item不是noteItem这个数据的话,我们需要手动把它添加到第一个位置去,到这里实际上都没有什么问题。
但是,当我看到
mAdapter.notifyItemChanged(0)
这个方法,直觉告诉我这里好像有点问题,当上面的逻辑走到else这里的时候,会往list里add一个新的item,但是这时候调用的刷新方法却是notifyItemChanged(0)。这个notifyItemChanged明显是刷新某个item的方法,即当这个item里的数据有变化时,调用这个方法去刷新这个item区域的UI,但是如果我们在adapter中add了一个新的item,再调用这个方法明显是不行的,这里是导致重复的原因嘛,我其实也不太确定。
问题复现
于是我写了一个Demo试了下。
class RecyclerViewActivity : AppCompatActivity() { private val mDataList = ArrayList<Any>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_recycler_view) val layoutManager = LinearLayoutManager(this) layoutManager.orientation = RecyclerView.VERTICAL recyclerView.layoutManager = layoutManager val customAdapter = CustomAdapter(mDataList) recyclerView.adapter = customAdapter for (i in 0..5) { mDataList.add("text: $i") } recyclerView.adapter?.notifyDataSetChanged() } //刷新方法 fun refresh(view: View) { mDataList.add(0, "add item") recyclerView.adapter?.notifyItemChanged(0) } }
构造一个普通的feed列表,每次点击刷新按钮,就会调用刷新方法,调用刷新方法的时候往index为0的位置再add一个item,然后再调用notifyItemChanged(0)方法,上下滑动后,发现数据是重复了。
下面放个gif图展示下效果。
从gif图中可以看到,点击刷新按钮,添加了”add item“,往下滑动后,出现了两个”text:5“的item,这个就是重复的item。
问题原因
我们看到notifyItemChanged的文档说明:
notifyItemChanged(int position)
This is an item change event, not a structural change event.RecyclerView中有两种不同数据改变事件,一种叫(item changes)项目改变,另一种叫(structual changes)结构改变。项目改变指的是某个单个item的数据发生变化,这个时候没有位置的改变。而structual changes则是有位置的变化发生,主要是数据源的变化会导致RecyclerView item位置发生变化。
我们这个问题是我们往数据源前面加了一个item,这个时候应该需要调用具有structual changes 的方法来刷新,而不是采用notifyItemChanged来刷新,因为notifyItemChanged是一个item changes 的方法。
-
三连问:MySQL如何实现可重复读、又为什么会出现幻读、是否解决了幻读问题?...
2021-03-29 00:41:29作者:sanyuesan0000https://blog.csdn.net/sanyuesan0000事务隔离级别有四种,mysql默认使用的是可重复读,mysql是怎么实现可重复读的?为...作者:sanyuesan0000
https://blog.csdn.net/sanyuesan0000
事务隔离级别有四种,mysql默认使用的是可重复读,mysql是怎么实现可重复读的?为什么会出现幻读?是否解决了幻读的问题?
一、事务的隔离级别
Read Uncommitted(未提交读)
在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。读取未提交的数据,也被称之为脏读(Dirty Read)。该级别用的很少。
Read Committed(提交读)
这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变,换句话说就是事务提交之前对其余事务不可见。
这种隔离级别也支持不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select查询可能返回不同结果。
Repeatable Read(可重复读)
这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。
简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。
InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题(mysql彻底解决了幻读问题?请往下看)。
Serializable(可串行化)
这是最高的隔离级别,它强制事务都是串行执行的,使之不可能相互冲突,从而解决幻读问题。换言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
在MySQL的众多存储引擎中,只有InnoDB支持事务,所有这里说的事务隔离级别指的是InnoDB下的事务隔离级别。
二、mysql怎么实现的可重复读
MVCC多版本并发控制(Multi-Version Concurrency Control)是MySQL中基于乐观锁理论实现隔离级别的方式,用于实现读已提交和可重复读取隔离级别。
在《高性能MySQL》中对MVCC的解释如下
举例说明MVCC的实现
新建一张表test_zq如下
MVCC逻辑流程-插入
在插入数据的时候,假设系统的全局事务ID从1开始,以下SQL语句执行分析参考注释信息:
begin;-- 获取到全局事务ID insert into `test_zq` (`id`, `test_id`) values('5','68'); insert into `test_zq` (`id`, `test_id`) values('6','78'); commit;-- 提交事务
当执行完以上SQL语句之后,表格中的内容会变成:
可以看到,插入的过程中会把全局事务ID记录到列 DB_TRX_ID 中去
MVCC逻辑流程-删除
对上述表格做删除逻辑,执行以下SQL语句(假设获取到的事务逻辑ID为 3)
begin;--获得全局事务ID = 3 delete test_zq where id = 6; commit;
执行完上述SQL之后数据并没有被真正删除,而是对删除版本号做改变,如下所示:
MVCC逻辑流程-修改
修改逻辑和删除逻辑有点相似,修改数据的时候 会先复制一条当前记录行数据,同事标记这条数据的数据行版本号为当前是事务版本号,最后把原来的数据行的删除版本号标记为当前是事务。推荐:Java面试练题宝典
执行以下SQL语句:
begin;-- 获取全局系统事务ID 假设为 10 update test_zq set test_id = 22 where id = 5; commit;
执行后表格实际数据应该是:
MVCC逻辑流程-查询
此时,数据查询规则如下:
查找数据行版本号早于当前事务版本号的数据行记录
也就是说,数据行的版本号要小于或等于当前是事务的系统版本号,这样也就确保了读取到的数据是当前事务开始前已经存在的数据,或者是自身事务改变过的数据
查找删除版本号要么为NULL,要么大于当前事务版本号的记录
这样确保查询出来的数据行记录在事务开启之前没有被删除
根据上述规则,我们继续以上张表格为例,对此做查询操作
begin;-- 假设拿到的系统事务ID为 12 select * from test_zq; commit;
执行结果应该是:
这样,同一个事务中,就实现了可重复读。
三、幻读
什么是幻读,如下:
InnoDB实现的RR通过mvcc机制避免了这种幻读现象。
另一种幻读:
姑且把左边的事务命名为事务A,右边的命名为事务B。
事务B执行后,在事务A中查询没有查到B添加的数据行,这就是可重复读。
但是,在事务A执行了update后,再查询时就查到了事务A中添加的数据,这就是幻读。
这种结果告诉我们其实在MySQL可重复读的隔离级别中并不是完全解决了幻读的问题,而是解决了读数据情况下的幻读问题。而对于修改的操作依旧存在幻读问题,就是说MVCC对于幻读的解决是不彻底的。
原以为这也是一种幻读,但经过多次研究资料,这只是对数据修改的操作(update、insert、delete)当前读产生的结果,他其实不是幻读。
快照读和当前读
出现了上面的情况我们需要知道为什么会出现这种情况。在查阅了一些资料后发现在RR级别中,通过MVCC机制,虽然让数据变得可重复读,但我们读到的数据可能是历史数据,不是数据库最新的数据。这种读取历史数据的方式,我们叫它快照读 (snapshot read),而读取数据库最新版本数据的方式,叫当前读 (current read)。
select 快照读
当执行select操作是innodb默认会执行快照读,会记录下这次select后的结果,之后select 的时候就会返回这次快照的数据,即使其他事务提交了不会影响当前select的数据,这就实现了可重复读了。
快照的生成当在第一次执行select的时候,也就是说假设当A开启了事务,然后没有执行任何操作,这时候B insert了一条数据然后commit,这时候A执行 select,那么返回的数据中就会有B添加的那条数据。之后无论再有其他事务commit都没有关系,因为快照已经生成了,后面的select都是根据快照来的。
当前读
对于会对数据修改的操作(update、insert、delete)都是采用当前读的模式。在执行这几个操作时会读取最新的版本号记录,写操作后把版本号改为了当前事务的版本号,所以即使是别的事务提交的数据也可以查询到。
假设要update一条记录,但是在另一个事务中已经delete掉这条数据并且commit了,如果update就会产生冲突,所以在update的时候需要知道最新的数据。也正是因为这样所以才导致幻读。推荐:Java面试练题宝典
四、如何解决幻读
在快照读情况下,mysql通过mvcc来避免幻读。
在当前读情况下,mysql通过X锁或next-key来避免其他事务修改:
使用串行化读的隔离级别
(update、delete)当where条件为主键时,通过对主键索引加record locks(索引加锁/行锁)处理幻读。
(update、delete)当where条件为非主键索引时,通过next-key锁处理。next-key是record locks(索引加锁/行锁) 和 gap locks(间隙锁,每次锁住的不光是需要使用的数据,还会锁住这些数据附近的数据)的结合。
Next-Key Lock即在事务中select时使用如下方法加锁,这样在另一个事务对范围内的数据进行修改时就会阻塞(为什么有共享锁会阻塞?不能在有共享锁的记录上加X锁):
select * from table where id<6 lock in share mode;--共享锁 select * from table where id<6 for update;--排他锁
关于next-key locks请参考
https://www.cnblogs.com/zhoujinyi/p/3435982.html
参考文章
https://juejin.im/post/5c68a4056fb9a049e063e0ab
https://zhuanlan.zhihu.com/p/35500144
https://www.jianshu.com/p/69fd2ca17cfd
https://blog.csdn.net/AAA821/article/details/81017704
https://dbaplus.cn/news-11-2518-1.html
《高性能MySQL》
END
推荐好文
>>【练手项目】基于SpringBoot的ERP系统,自带进销存+财务+生产功能>>分享一套基于SpringBoot和Vue的企业级中后台开源项目,代码很规范! >>能挣钱的,开源 SpringBoot 商城系统,功能超全,超漂亮!
-
【数据库问题】oracle查询出现重复数据
2018-12-28 10:51:04select * from ( select row_.*, ... rownum rownum_ ...数据量不是一条两条,而是很多条,需要分页显示,而上面这个sql语句是最常用的分页方式,而rownum是一个伪列,而我们经常误认为我们...则会出现重复数据 -
苹果手机系统中联系人出现大量重复的问题及解决方法_我是亲民_新浪博客
2020-04-14 10:35:17移除重复的联系人 请根据您的操作系统按照相应步骤操作。 在 Mac 上 1、备份通讯录。 2、打开“通讯录”。 3、从“名片”菜单中,选择“名片”>“查找重复项”。 4、当系统提示时,点按“合并”。 5、重复第 2 步... -
系统设置反复被改,删除的文件反复出现,教你找出罪魁祸首!
2019-09-28 20:44:13在使用电脑的过程中,可能会遇到这样一些问题: 桌面有流氓的“网址导航”快捷方式,删除后没多久又出现了。 某路径出现了占很大空间的文件夹,不知道谁创建的。 某个系统设置,修改后没...问题频繁出现的话,用Pr... -
SpringDataJpa映射无主键表出现数据重复问题解决
2019-08-16 09:03:23搜资料提示orm映射的表必须有主键 网上说放一...使用默认查询的时候 会出现问题 返回所有数据都是重复 select id,comid from st_PkgActvty_comset where id = 'SPA0000001' 解决方法 在这里插入代码片 @Table(name... -
处理视频流时可能出现的重复帧问题及解决办法
2018-05-05 14:14:47在Ubuntu下使用opencv处理视频流时,由于相机...1. 用高帧率的相机,但是由于经费问题,此方案暂缓执行; 2. 判断返回值是否相同,如果返回的数据完全相同,则有比较高的置信度认为这是通过同一幅图像返回的结果;... -
sql进行Order by排序再进行分页limit取值会出现重复显示问题
2018-09-03 18:08:19在实际开发中遇到一个有趣的问题,有关数据库order by排序不唯一,导致分页出现重复数据问题。这个问题还是有点特殊的。因为数据库研究的少这个问题挺让我困惑。为了解决它找了很久的错误。 首先介绍一下问题的出现... -
MySQL事务之不可重复读问题
2019-05-01 18:25:35在事务的并发操作中,也就是多个事务同时对同一组数据进行操作时,可能会出现脏读、不可重复读、幻读、丢失更新这四个问题,本篇博客就来为大家讲解 不可重复读 问题。 不可重复读 就是一个事务读到另一个事务修改... -
RedisAtomicLong自增并发出现重复编号
2021-04-14 22:59:12近期公司的订单编号出现重复编号,并且每次都是前几个编号重复,后面就不会出现,从现象猜测八成是竞态条件下出现并发问题。 幸运的是我竟然能在本地重现,启动100个线程并发创建自增id,确实是会有编号0,1,2重复... -
win10系统电脑键盘打字时总是出现重复字符的还原方法
2021-07-24 02:45:09其实解决win10系统电脑键盘打字时总是出现重复字符的问题也不是难事,小编这里提示两点:1、首先在win10系统桌面,单击“开始”按钮,然后在弹出的菜单中选择“控制面板”选项; 选择“控制面板”选项 2、打开“控制... -
mybatis-plus sqlserver 排序分页,出现重复数据的问题
2019-09-27 14:46:16排序时候,如果排序字段不是唯一字段,两次查询数据顺序会不一直,导致一条记录出现在多页 插件生成sql: WITH selectTemp AS ( SELECT TOP 100 PERCENT ROW_NUMBER ( ) OVER ( ORDER BY 排序字段) AS __row_... -
Android 解析软件包时出现问题
2018-10-09 15:48:41Android 解析软件包时出现问题 解决方案:Settings -&gt; Build,Execution,Deployment -&gt; Instant Run -&gt; 取消这个功能。 以下为吐槽: 每次升级Android Studio都是玩命一般的刺激... -
RocketMQ常见问题-消息重复消费和消息重复的问题
2020-05-02 18:05:01RocketMQ不解决消息重复问题,RocketMQ不解决消息重复问题,RocketMQ不解决消息重复问题,重要的事情说三遍。 基本上说我很讨厌有人问这个问题,问这个问题首先你对消息的生命周期缺乏理解,其次RocketMQ的定位不是... -
在命令行键入“cl”时出现不是内部或外部命令,也不是可运行的程序或批处理文件的问题。
2017-02-20 16:01:49本人采用Visual Studio 2010编译器编译代码,根据书上给出命令测试,结果出现“在命令行键入“cl”时出现不是内部或外部命令,也不是可运行的程序或批处理文件的问题。”百度后得到解决方法并且有所拓展。 在... -
Java如何处理并发情况下数据重复插入的问题
2021-05-23 18:17:20笔者这段时间在做第三方用户接入的时候碰到了一个问题:由于自身的系统是在第三方发送请求的时候直接将第三方的账号数据存入数据库的,所以当页面出现多个请求并发执行的时候,会出现用户数据重复插入的问题,之后... -
你的开始菜单出现了问题,我们将尝试在你下一次登录时修复它
2020-04-15 10:48:19(1)解决我问题的办法: 使用了这个办法:https://blog.csdn.net/maxsky/article/details/48321309 新建文本文档,复制粘贴: Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\... -
在各页顶端以标题行形式重复出现无效
2018-06-12 08:49:00重复标题行其实这个问题的功能操作本身不复杂,但是经常勾选了“在各页顶端以标题行的形式重复出现”的选项,但是标题行并没有出现。 正确的做法是: 1.全选中整个表格,进入:右键->表格属性->行->将... -
解决Office 2007 “向程序发送命令时出现问题”
2014-10-30 10:16:27在Windows 7 上,资源管理器中双击OFFICE 2007文档打开时经常会出现“向程序发送命令时出现问题”,只打开了程序界面,文档却没有打开,再次双击文档图标才能打开,或者先打开程序,然后把文档图标拖到OFFICE程序中... -
Mybatis MySQL数据库分页查询出现重复数据
2019-09-11 14:44:07今天在生产环境,业务同事导出文件时遇到了出现重复数据的问题。因为之前这个功能是我和我带的外包同事一起做的,所以很熟悉这块代码。经过线上操作核对,和代码检测,发现线上查询确实出现了重复数据,而导出... -
关于powerbi拖动多表关系,出现的关键字重复问题
2017-08-15 15:13:58power bi遵循严格的主外键关系,这样可以保证数据源在进入报表时候的绝对逻辑正确性,然而在实际工作中,尤其在处理多表关联的时候,大部分情况,并不是主外键的关联关系,这个时候在power bi中会出现没有不重复键的... -
电脑出现问题“windows遇到关键问题将在一分钟后重启,请您立即保存您的工作”的解决方法
2019-02-18 10:27:01一天早上开启电脑,发现电脑出现问题,弹出一个对话框,上面这样写道:“windows遇到关键问题将在一分钟后重启,请您立即保存您的工作”,重启了好多次都是这样,上网查阅了一些资料,现在把解决方法分享给各位博友... -
安装anaconda出现菜单里只有anaconda prompt,“conda'不是内部或外部命令 ’”问题的标准答案
2018-11-13 11:25:52按照小白的流程走完后,喵哥惊讶地发现只有一个“anaconda prompt”,本想着借此机会好好熟悉一下prompt的命令,但是在打开“anaconda prompt”时,出现“conda'不是内部或外部命令 ’”问题。这是用都用不了! 然.... -
Android 7.0解析包时出现问题 的解决方案(应用内更新)
2017-02-16 18:59:34在工作上遇到了一个关于下载更新安装包无法安装的问题,解决之后...在我的项目中,出现了一个问题,就是当安装包下载到本地的时候,产生了“解析包时出现问题”这样的错误,导致无法安装相应的新版本。同时,值得一提 -
filebeat重复采集数据问题排查
2021-07-18 15:40:05首先接收到告警,查看了这个业务最近7天的一个流量图,基本上量都很小,每秒也就2k左右的数据流量,但是今天下午流量直接跑到了30k/s并且持续了一段时间. 首先找到业务方负责的SRE同事,确认流量是否属于正常(不... -
01-pandas 数据连接 Merge 数据重复问题
2021-06-16 20:20:45Merge Merge 使用的时候,不是Key的表里不能有重复,key表就是how='xx'的那个表 比如我有下面两个表,当我用pd.merge(左表名,右表名,on='PN',how='left') 我期望得出来的是下面这样的。毕竟用python大多数时候是... -
消息队列三:消息重复消费问题(幂等性)
2019-05-22 13:22:30如何保证消息不被重复消费啊(如何保证消息消费时的幂等性)? 其实这个很常见的一个问题,这俩问题基本可以连起来问。既然是消费消息,那肯定要考虑考虑会不会重复消费?能不能避免重复消费?或者重复消费了也别... -
Python:wordcloud构建词云出现关键字重复的情况!已解决!
2021-05-19 01:43:24如图所示,这个词云展示的内容出现了同一关键词重复的现象,这并不是我们想要的 问题解决 其实这种情况与collocations参数有关,默认collocations=True,会统计搭配词。比如你的text是“我爱码代码”,当...