問題背景:
使用者的rds資料庫,最近出現了這樣一個問題:沒有使用讀寫分離,送出一個update語句修改狀态值,修改之後,當時查不到修改後的值,查到的還是修改前的值,過了2小時之後才可以查到,審計日志看sql語句是更新成功的。
以下是使用者提供的截圖資訊
問題分析:
通過截圖可以看到将invest_status狀态值修改為3,但是navica 查到的還是修改前的值2。
解析binlog看,日志裡确實有執行成功過update,看使用者的截圖。binlog資訊裡看### @13=3 / INT meta=0 nullable=1 is_null=0 / 該字段确實修改了。
現場排查:
下午使用者側複現問題,聯系我們繼續分析,還是做了update但是查不到結果。SQL語句是這樣的:
UPDATE project_periods SET return_time=1563166809672 , return_status = 2 , update_time = 1563166809672 WHERE pro_id = 104 and new_period = 5
查詢時候确實沒有被更新
審計日志裡看當時确實update過這個sql
分析:SQL審計裡我們看到的SQL語句,是執行過,但是未必送出,是以還需進一步分析
select * from information_shema.innodb_trx ,發現有與使用者回報時間一緻的一個線程處于running狀态,并未被送出
show processlist可以看到該SQL線程15833244
說明正如分析所說,事務還未送出,而RDS的預設隔離級别是RC,如果不在一個事務裡查詢,事務送出之前其他會話看不到,RC隔離級别是送出讀,也就是送出後,其他會話才能查到。過了2小時左右事務被送出,審計裡看到了該SQL線程15833244 commit
使用者側确認是架構修改後,事務自動送出部分有變導緻的,問題解決。
附上事務隔離級别說明,RDS預設隔離級别RC: