前幾天犯了個低級錯誤。在一個事務方法里老是查詢不到某條記錄,可是debug卡住時,用db工具查。又能查出值。
經過一番折騰,原來是我在同一個事務里 查詢 了已刪除可是未提交的數據。當然查詢不到了!
。!
情況是這種:
Service層(spring事務管理配置在這一層,此方法配了PROPAGATION_REQUIRED)有個方法function m()寫得非常長。
當中有2步是
1. delete from B where objectid =‘TestB’
2. select * from A where A.bobjectid in (select objectid from B where objectid =‘TestB’)
因為 step 1和step 2 在同一個事務方法。並且step1已經刪除了TestB。故step2肯定查詢不到記錄。
事實上這是個非常easy發現的問題,可是因為m方法,步驟較多較復雜。並且step1和step2的代碼位置相隔較遠。m方法最先也不是本人編寫的,
所以被搞得有點蒙,直到排除了其他全部的可能,才確認是事務未提交造成的。
解決的方法so easy了,把step2 提到step1前面就能夠了。
今天特地補一篇。提醒以后不要浪費時間犯這樣的錯誤。