一樣的sql語句,在PLSQL和SQLPLUS中的查詢結果不同,您見過嗎?sql
今天在PLSQL的SQL Window中執行了一個查詢select * from t_user; 查詢到6條記錄:數據庫
後來爲了方便測試其餘的數據,打開了sqlplus,執行了相同的查詢語句,意外發生了:< 喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KCjxwPiAgICAgICAgICAgICAgICAgPGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20150530/20150530094323101.png" alt="\">oracle
只查詢到一條記錄,你沒看錯,一樣的用戶,一樣的sql語句,一樣的時間,在PL/SQL和SQLPLUS中的查詢結果不同。因而不甘心啊,又開了n個sqlplus窗口,執行結果都是隻查詢到一條記錄。又在PS/SQL中另外開了一個SQL Window,執行一樣的sql語句以後,跟sqlplus查詢結果同樣,也是一條記錄。測試
因而回想到問題多半就出在那個查詢到6條數據的PL/SQL的sql窗口了。這時發如今它裏面執行查詢select * from t_user;以前,還曾插入了5條記錄:spa
原來,與以前用過的SQL Server和MySQL有所不一樣,在操做oracle時,對數據進行了操做後,這些操做都只是提交到了內存,並沒更新物理文件,最後若是須要更新到物理文件,須要執行commit命令。code
這時,在這個插入5條數據的sql窗口中執行commit命令,數據就真正意義上的插入到數據庫物理文件中了!orm
因此,在oracle中,只要是數據庫進行了使數據改變的操做(增、刪、改等)後,都須要執行commit命令將更新提交到數據庫的物理文件,不然前面所作的操做都是徒勞的。事務
瞭解EntityFramework的同志們這時可能已經想到了SaveChanges(),沒錯!道理是同樣兒同樣兒滴~~內存
須要注意的是,一旦對某個表進行操做以後,commit以前,這張表就會處於鎖定的狀態,一旦被鎖定,其餘事務就沒法對它進行操做,以下:get
打開兩個sqlplus窗口,對同一張表執行相同的更新操做,可是不commit。
先執行select * from t_user set user_name='userA' where user_id='user5' :
再執行 select * from t_user set user_name="userB' where user_id='user5' :
第一個操做更新了1行,然後執行的操做已經死掉了,並無提示「已更新1行」。
緣由就是第一個操做並無執行commit,已經把表t_user鎖了(也就是傳說中的鎖表),因此在第一個操做commit以前,是不容許其餘事務對這張表操做的。
對於plsql 來講,在sql 窗口裏面,執行一下就能夠了。
commit