日期:2014-05-17  浏览次数:20992 次

commit概念请教(新手)
1.请问,我在PL/SQL中,SQL窗体中执行一条insert 语句到表T,后面没跟着commit,此时我查表T是有刚插入的记录的,此时是否真正的对表T数据进行了更新?

2.此时我关掉PL/SQL,重打开(就是想看数据是否真正更新),查询表T,也是有刚才插入的记录的(是否可认为刚才没有commit,但数据其实已提交?或者是先没又提交,但在哪个点最终自动提交了?),这其中ORACLE到底是如何处理这种事务机制的。

3.存储过程总执行SQL,是否不加commit,也是可以真正提交数据?和上面说的情况一样(某种自动提交机制?)?

3.总结,我SQL语句最后加不加commit,到底区别在哪?


------解决方案--------------------
1.是真的插入了表T。
2.正常关闭客户端,会触发commit,非正常关闭客户端(kill 进程),会触发rollback。
3.不可以。
总结,事务的完整性直接影响到数据库性能。
宜短事务,不宜长事务。
------解决方案--------------------
第一点的答案是不对的,如果你另外打开一个窗口,是看不到已提交的数据的。。


------解决方案--------------------
存储过程中不加commit,那就得在调用过程的 外层加。。。
------解决方案--------------------
1、没进行commit操作,实际数据是没更新的。
------解决方案--------------------
2、估计是 oracle 你设置成自动 commit/提交啦!!!
------解决方案--------------------
引用:
Quote: 引用:

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

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


第一点我没有说错,数据已经插入了表,但是其它的session是看不到的,至于为什么看不到,你们可以看UNDO相关资料。
这就是为什么commit小数据与commit大数据时间几乎相差无几的原因。
------解决方案--------------------
plsqldev设置了自动提交吧。  
如果没有提交, 你在关闭窗口的时候一般有提示的。 
------解决方案--------------------
oracle是以事务为隔离单位的。正常情况下,事务未提交时,本事务可以看到已经更改的信息。但另一个事务是看到更改的数据,除非事务提交,这是问题1.数据库在关闭后,或者是进行ddl语言前,默认是会将未提交的事务进行提交的,这是问题2。存储过程是不会自动提交的,除非满足自动提交的条件。
------解决方案--------------------
引用:
了解了,也就是说我在SQL窗口insert一条记录没有commit,相对于其他session,就可以认为没有插入表吧。
而我关掉PLSQL重打开,oracle是有个自动提交的机制。
存储过程中不commit,等于没改数据。。


我在SQL窗口insert一条记录没有commit,相对于其他session,就可以认为没有插入表吧
--这个可以这么理解。

我关掉PLSQL重打开,oracle是有个自动提交的机制。
--这个不是oracle有自动提交的机制,而是plsql developer设置为关闭窗口自动提交。可以在plsql developer中的菜单preferences--connection--logoff with open transaction中设置,默认为commit

存储过程中不commit,等于没改数据。。--可以这么认为
------解决方案--------------------
引用:
第一点的答案是不对的,如果你另外打开一个窗口,是看不到没有提交的数据的。。

是对的
建议你看看UNDO的相关资料
------解决方案--------------------
引用:
Quote: 引用:

第一点的答案是不对的,如果你另外打开一个窗口,是看不到没有提交的数据的。。

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


如果真正的插入了表T,为什么另外 的窗口看不到 没有commit的数据呢?