一个事务有如下属性:
1、原子性:一个事务要么完全发生,要么完全不发生。
2、一致性:事务把数据库从一个一致的状态转变到另一个状态。
3、隔离性:在事务提交以前,其他的事务察觉不到事务的影响。
4、持久性:一旦事务提交,它是永久的
在oracle 中没有“开始事务”语句。事务隐式地开始于第一条修改数据的语句(第一条得到TX锁定的语句)。发出一条commit 或 rollback语句显式地结束。
默认情况,完整性约束检查在整条sql语句执行完成以后进行。注意,这里所说的是“sql语句”而不是“语句”;
如果在一个pl/sql存储过程中有许多sql语句,那么在每条sql语句执行完后立即进行完整性约束检查而不是在整个存储过程执行完后进行。可以用编程的方法推迟完整性约束检查,直到事务提交或开发人员要验证时执行。
为什么完整性约束检查是在sql语句执行完后进行,而不是在sql语句执行期间进行?
这是因为在同一时间只有一条语句处理某行数据才是正常的。
-------------------------------------------------------------------------------
一般的程序员在循环中使用过程化的方法,这样能逐行地提交。这样做的原因主要有两个:
1、经常提交一些小的事务比执行和提交一个大的要快,效率高。
2、可能没有足够的回滚段空间。
这两个结论都是被误导的。一般地,频繁提交并不快,而用单条sql语句完成几乎总是比较快的。通过一个小例子来说明
SQL> create table t as select * from all_objects;
Table created.
SQL> set timing on
SQL> ed
Wrote file afiedt.buf
1 begin
2 for x in(select rowid rid,object_name,rownum r from t)
3 loop
4 update t
5 set object_name=lower(x.object_name)
6 where rowid=x.rid;
7 if(mod(x.r,100)=0) then
8 commit;
9 end if;
10 end loop;
11 commit;
12* end;
SQL> /
PL/SQL procedure successfully completed.
Elapsed: 00:00:05.00
SQL> update t set object_name=lower(object_name);
47328 rows updated.
Elapsed: 00:00:03.48
从中可以看出,频繁的提交并没有带来性能上的提升,反而更慢了!
阅读(1411) | 评论(0) | 转发(0) |