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之前,是不允許其他事務對這張表操作的。

              

                  

               

         

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

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.