您的位置:首页 > 数据库 > Oracle

ORACLE事务的原子性

2007-10-21 10:12 330 查看
ORACLE的事务与SQL server以及sybase有很大的不同,举个例子,假如表a有以下记录:
field1
1
3
0
4
其中对field1字段的约束条件是field1>0,那么当我们执行update a set field1=field1-1这条SQL语句时,将会出现一个错误,因为其中的第三条记录的field1等于0,减去1之后就会违反约束条件。
那么在SQL server或sybase中,出现这种错误之后,必须使用回滚来使表a回到修改之前的情况,否则第一二条记录的修改将会被保留;而在ORACLE中,表a还是会保持原样,所有的记录不会有任何变化。
这就是ORACLE事务的一个特性:原子性,SQL语句的效果是要么全部提交,要么全部回滚。如果语句出现错误,那么这条语句在错误之前的已经发生全部修改都回滚。
在ORACLE的事务处理中,存储过程的调用也是作为一个语句来看待的。也就是说,在调用ORACLE中调用存储过程,如果存储过程中出现了错误,ORACLE会自动回滚到存储过程被调用前的情况。
在SQL server和sybase中,事务是必须显示地开始的,否则每个语句本身就是一个事务,而在ORACLE中,事务是隐式的,没有办法自动提交,除非客户端的专门实现,例如ODBC和JDBC默认是会自动提交的(当然你也可以使用设置连接的属性来把事务的控制权取回来)。
对于有些情况下,我们可能需要保存已经进行的修改,那就需要when others来处理了,在exception处理中加上when others then null就会忽略语句中的错误,继续下去。
在ORACLE中,如下的语句:
begin
savepoint sp;
update a set field1=field1-1;
exception
when others then
rollback to sp;
end;
这种写法是完全没有必要的,因为这实际上是ORACLE自动事务的模仿,是一种重复。对于ORACLE事务的原子性和一致性已经实现的东西,实在没有必要再去重复。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: