背景
昨天在做項目中,有一個業務是需要先修改狀態,再查詢成功狀態的條目,在測試中發現,一共十條數據,其中三條修改為成功狀態,但是再次查詢,發現三條數據為初始狀態,說明沒有查詢到修改后的數據。
排查
這種問題一般和事務的隔離機制有關,mysql默認事務隔離級別是可重復讀,事務隔離機制是作用在兩個或多個事務上的,單個事務肯定是不存在隔離機制的,首先排查代碼有沒有開啟新的事務
結果
排查中發現,其中一個方法,是復制過來的,將@Transactional注解一塊復制過來的,導致修改操作開啟了一個新的事務,查詢操作和修改操作不在同一個事務中,而mysql默認隔離級別是可重復讀,所以查詢到的結果為修改前的數據。