1.请问,我在PL/SQL中,SQL窗体中执行一条insert 语句到表T,后面没跟着commit,此时我查表T是有刚插入的记录的,此时是否真正的对表T数据进行了更新?2.此时我关掉PL/SQL,重打开(就是想看数据是否真正更新),查询表T,也是有刚才插入的记录的(是否可认为刚才没有commit,但数据其实已提交?或者是先没又提交,但在哪个点最终自动提交了?),这其中ORACLE到底是如何处理这种事务机制的。3.存储过程总执行SQL,是否不加commit,也是可以真正提交数据?和上面说的情况一样(某种自动提交机制?)?3.总结,我SQL语句最后加不加commit,到底区别在哪?

解决方案 »

  1.   

    1.是真的插入了表T。
    2.正常关闭客户端,会触发commit,非正常关闭客户端(kill 进程),会触发rollback。
    3.不可以。
    总结,事务的完整性直接影响到数据库性能。
    宜短事务,不宜长事务。
      

  2.   

    先谢了,不过有疑问,你说正常关闭客户端回触发commit,但我列的第一点,没有commit,也没有关闭客户端,你说已实现真正更新?怎么说。如果按你说的没commit,但已更新,那和我加commit,是什么区别?
      

  3.   

    存储过程中不加commit,那就得在调用过程的 外层加
      

  4.   

    1、没进行commit操作,实际数据是没更新的。
      

  5.   

    2、估计是 oracle 你设置成自动 commit/提交啦!!!
      

  6.   

    先谢了,不过有疑问,你说正常关闭客户端回触发commit,但我列的第一点,没有commit,也没有关闭客户端,你说已实现真正更新?怎么说。如果按你说的没commit,但已更新,那和我加commit,是什么区别?
    第一点我没有说错,数据已经插入了表,但是其它的session是看不到的,至于为什么看不到,你们可以看UNDO相关资料。
    这就是为什么commit小数据与commit大数据时间几乎相差无几的原因。
      

  7.   

    plsqldev设置了自动提交吧。  
    如果没有提交, 你在关闭窗口的时候一般有提示的。 
      

  8.   

    oracle是以事务为隔离单位的。正常情况下,事务未提交时,本事务可以看到已经更改的信息。但另一个事务是看到更改的数据,除非事务提交,这是问题1.数据库在关闭后,或者是进行ddl语言前,默认是会将未提交的事务进行提交的,这是问题2。存储过程是不会自动提交的,除非满足自动提交的条件。
      

  9.   

    了解了,也就是说我在SQL窗口insert一条记录没有commit,相对于其他session,就可以认为没有插入表吧。
    而我关掉PLSQL重打开,oracle是有个自动提交的机制。
    存储过程中不commit,等于没改数据。。
      

  10.   


    我在SQL窗口insert一条记录没有commit,相对于其他session,就可以认为没有插入表吧
    --这个可以这么理解。我关掉PLSQL重打开,oracle是有个自动提交的机制。
    --这个不是oracle有自动提交的机制,而是plsql developer设置为关闭窗口自动提交。可以在plsql developer中的菜单preferences--connection--logoff with open transaction中设置,默认为commit存储过程中不commit,等于没改数据。。--可以这么认为
      

  11.   

    是对的
    建议你看看UNDO的相关资料
      

  12.   

    是对的
    建议你看看UNDO的相关资料如果真正的插入了表T,为什么另外 的窗口看不到 没有commit的数据呢?