今天碰到了一個奇怪的問題,是關於Oracle一個事務中的Insert和Update語句的執行順序的問題。 首先詳細說明下整個過程: 有三張表:A,B,C,Java代碼中有一段代碼是先在表A中插入一條數據,然後再更新表B的兩個欄位,更新的兩個欄位是特定值。並且插入和更新在一個事務中。 有個需求需要在表 ...
今天碰到了一個奇怪的問題,是關於Oracle一個事務中的Insert和Update語句的執行順序的問題。
首先詳細說明下整個過程:
有三張表:A,B,C,Java代碼中有一段代碼是先在表A中插入一條數據,然後再更新表B的兩個欄位,更新的兩個欄位是特定值。並且插入和更新在一個事務中。
有個需求需要在表A添加一個Insert的行級觸發器,在觸發器里,插入表A一行記錄後去表B查看更新的兩個欄位是否滿足特定條件,
如果表B的兩個欄位同時等於特定值,則把表A和表B的數據整合下放到表C。觸發器的初衷就是這樣。
可問題來了,測試觸發器的時候,發現表B的兩個欄位總不能滿足條件。查詢下表B,發現表B的兩個欄位已經更新,並且兩個都是特定值。新建測試視窗,插入表A一條測試記錄,能在表C插入整合後的數據。
初步推斷可能是在事務中,Insert語句先執行了,先觸發了觸發器,然後才進行表B的兩個欄位的更新。
所以就修改了Java代碼事務中Insert語句和Update語句執行順序,把Update語句放到Insert語句之前,結果還是一樣,不能在表C插入整合後的數據。
後來在表B上面創建了一個Update觸發器,禁用表A的Insert觸發器,測試表B的Update觸發器是發現當更新的兩個欄位滿足特定條件後,去表A能查詢到新插入的數據,能把整合後的數據插入到表C。
得出最終不成熟的結論:Oracle一個事務中,Insert語句比Update先執行。