PL/SQL和SQLPLUS查詢結果不一樣——千萬別忘記commit !,sqlpluscommit

來源:互聯網
上載者:User

PL/SQL和SQLPLUS查詢結果不一樣——千萬別忘記commit !,sqlpluscommit



        同樣的sql語句,在PLSQL和SQLPLUS中的查詢結果不一樣,您見過嗎?


        今天在PLSQL的SQL Window中執行了一個查詢select * from t_user;  查詢到6條記錄:


                 


        後來為了方便測試其他的資料,開啟了sqlplus,執行了相同的查詢語句,意外發生了:


                 


       只查詢到一條記錄,你沒看錯,同樣的使用者,同樣的sql語句,同樣的時間,在PL/SQL和SQLPLUS中的查詢結果不一樣。於是不甘心啊,又開了n個sqlplus視窗,執行結果都是只查詢到一條記錄。又在PS/SQL中另外開了一個SQL Window,執行同樣的sql語句之後,跟sqlplus查詢結果一樣,也是一條記錄。


       於是回想到問題多半就出在那個查詢到6條資料的PL/SQL的sql視窗了。這時發現在它裡面執行查詢select * from t_user;之前,還曾插入了5條記錄:


                 


       原來,與之前用過的SQL Server和MySQL有所不同,在操作oracle時,對資料進行了操作後,這些操作都只是提交到了記憶體,並沒更新物理檔案,最後如果需要更新到物理檔案,需要執行commit命令。

       這時,在這個插入5條資料的sql視窗中執行commit命令,資料就真正意義上的插入到資料庫物理檔案中了!


       所以,在oracle中,只要是資料庫進行了使資料改變的操作(增、刪、改等)後,都需要執行commit命令將更新提交到資料庫的物理檔案,否則前面所做的操作都是徒勞的。

      

       瞭解EntityFramework的同志們這時可能已經想到了SaveChanges(),沒錯!道理是一樣兒一樣兒滴~~


       需要注意的是,一旦對某個表進行操作之後,commit之前,這張表就會處於鎖定的狀態,一旦被鎖定,其他事務就無法對它進行操作,如下:


       開啟兩個sqlplus視窗,對同一張表執行相同的更新操作,但是不commit。


       先執行update t_user set user_name='userA' where user_id='user5' :


                 


      再執行 update t_user set user_name='userB' where user_id='user5' :


                 


        第一個操作更新了1行,而後執行的操作已經死掉了,並沒有提示“已更新1行”。


        原因就是第一個操作並沒有執行commit,已經把表t_user鎖了(也就是傳說中的鎖表),所以在第一個操作commit之前,是不允許其他事務對這張表操作的。

              

                  

               

         

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.