天天看點

MySQL突然出現某些記錄無法更新

    一直運作良好的系統這兩天出現奇怪的問題:某些記錄無法更新成功。具體錯誤如下:

 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隻能讀取一條記錄但是無法修改它呢?

繼續閱讀