一直运行良好的系统这两天出现奇怪的问题:某些记录无法更新成功。具体错误如下:
Caused by: org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:85)
at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:70)
at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:90)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:268)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:185)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
考虑到这两天系统只是前端有少许改动,于是让前端开发人员去定位,前端定位半天后说相关地方没改动,要求后台开发人员查,后台开发人员很抗拒,因为最近后台并没更新,这问题是这两天才出现的,后台不情愿地追踪了半天蒙了,发现同样的代码流程,某些记录能够更新成功,某些则失败。后台直接跟我说搞不定了,太诡异了。无奈之下只好自己去查。
网上搜到的关于Caused by: org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 异常的文章都和我们的情况不符。该异常的描述的意思是:本次更新本来期望能得到更行成功一条的返回信息,却得到成功0条,于是hibernate就报错了。
根据反复的测试和debug,发现几个特点:1. 可以更新的记录总是可以更新;2. 更新失败的总是更新失败;3. 新增的记录总是可以更新成功;4. 可以更新的和不可以更新的记录间找不出规律能将两类区分;5. (最重要的一点)不能更新的记录手动也无法更新。
上面的第5点让我想起本周虚拟机挂掉的情况,我们的系统都跑在虚拟机上,本周一所有的虚拟机都挂掉了,后来由维护人员恢复了。难道这次宕机让硬盘受到损害导致MySQL部分数据只能读无法写?为了验证这个想法,我把数据库全部导出然后再全部导入,问题解决了!
这真是个有趣的问题,什么样的损害会导致MySQL只能读取一条记录但是无法修改它呢?
相关推荐
- 数据库中的某些表无法被访问,可能是由于误操作或其他原因导致的。 7. **MySQL崩溃** - MySQL服务突然停止运行。 8. **主机Hung** - 主机响应异常缓慢或完全无响应。 #### 三、故障诊断方法 为了准确地定位和...
MySQL中的自增ID是表设计中的一个重要元素,特别是在需要唯一标识每条记录的场景下。然而,当自增ID超出其定义的最大值时,就会出现所谓的“超大问题”。这个问题通常发生在频繁进行删除和插入操作的表上,尤其是在...
在处理突发的CPU使用率升高、并发线程数激增、QPS(每秒查询率)飙升、慢查询增加、网络流量异常以及磁盘IOPS(输入输出操作每秒)突然增高等问题时,传统的监控手段如show processlist和show engine innodb status...
通过对MySQL高可用方案的深入探讨,我们可以看到,在构建金融级别的MySQL高可用系统时,需要综合考虑多种因素,包括但不限于数据的一致性、业务的连续性以及可能出现的各种故障类型。通过合理的设计和选择合适的方案...
然而,在某些场景下,例如数据库初始化或者数据清理后,我们可能需要让自增ID重新从1开始。以下就是两种解决这个问题的方法: **方法一:清空表并重置自增ID** 如果不再需要表中的历史数据,可以使用`TRUNCATE ...
MySQL MyISAM存储引擎是早期常用的非事务处理引擎,它以快速读取和低内存消耗而闻名。在处理大量数据时,对MyISAM表进行优化可以显著提升数据库的性能。以下是一些关键的MyISAM优化设置: 1. **myisam_max_extra_...
例如,如果数据表经常更新,可能会出现“幻行”问题,即某些行可能在用户滚动页面时突然消失或出现。此外,当数据量特别大时,OFFSET操作可能会变得效率低下,因为它需要扫描并跳过很多行。 为了优化分页性能,可以...
MySQL的安装过程被详细记录,包括安装服务器端和客户端软件,以及用于开发的库文件。作者还简要提到了MySQL Workbench的使用。 最后,作者提到了Shutter这款软件的安装。Shutter是一款屏幕截图工具,作者通过Ubuntu...
案例中提到了SQL以前执行没有问题,现在却突然变慢的情况,这可能是由于数据量的增长或统计信息更新导致优化器重新选择了索引。 6. 聚簇索引和二级索引的区别: 聚簇索引基于表的主键构建,表中的数据行实际上是...
MyBatis使用简单的XML或注解用于配置和原始映射,将接口和Java的POJOs(Plan Old Java Objects,普通的Java对象)映射成数据库中的记录. orm工具的基本思想 无论是用过的hibernate,mybatis,你都可以法相他们有一个...
6. **数据库管理**:存储用户信息、聊天记录等数据,可能使用了关系型数据库如MySQL,或者NoSQL数据库如MongoDB。Java提供了JDBC(Java Database Connectivity)来处理数据库操作。 7. **安全**:考虑到聊天应用...