在事务中有三个对象:commit、 rollback、 savepoint;
1、commit:保存会话开始对数据库所做的修改,或是从会话中最近的提交之后所做的修改。
哪一个在时间上更为接近就保存哪一个。
2、rollback:撤销自从最后一次commit(提交)之后对数据库所做的修改。
3、savepoint:再回话总提供可选择的commit标记,目的是通过一个或多个可选择的点来支持将来执行的commit或rollback动作。可以撤销(或不撤销)这些可选点之后所做的修改。
4、commit对数据库做出了永久的变动,一旦提交之后,这些变动就无法在通过rollback语句来撤销。
5、SQL认为一系列的SQL语句可以构成一个‘事物’,并将其作为一个单元来看待。事务内部所做的更改在提交之前不会成为永久性的。提交事件将会结束这个事务。
6、在Oracle中存在两种提交方式:显示提交,发生在执行commit语句时。 隐式提交,当特定数据库事件发生时自动发生。
现在举个列子:
insert into table values(11,12,13) ;
commit;
在这个列子中insert 对table做的插入由commit语句进行了永久化。如果没有commit语句,则insert 所做的更改可以使用rollback语句撤销;
7、隐式提交发生在数据库中发生特定事件时。这些事件包括:任何的DDL语句,如create、later、drop、grant、revoke注意即使DDL语句因为执行错误失败(不是语法错误),DDL语句执行之前隐式提交也会被执行并生效。
8、为什么在提交(显示或隐式)之前能够进行回滚而提交之后不能进行回滚?
在提交事件发生之前所做的改动都处于一种临时区域中,用户可以在一种类似“草稿”的模式下工作,但是任何提交事件,无论显示或隐式,都会使得改变成为永久性的,并会将新的数据显示给大部分的用户群。
9、savepoint语句是支持rollback和commit语句的TCL的组成部分。savepoint语句在一个事务内建立分隔点,从而使得后续commit和rollback语句可以进一步细分能够保存或撤销数据的位置。
10、使用savepoint的规则:
(1)所有的savepoint语句都必须包含一个名称。在后台,您所创建的savepoint名称会与“系统变更号”(system change number,scn)"相关联。这是savepoint所标注的对象。
(2)在一个事务中不应当重复savepoint的名称,事务是以提交事件作为结束的一连串的SQL语句。如果重复一个名称,那么不会看到语法错误或执行错误。相反,新的savepoint会覆盖较早的savepoint,从效果上是将之前的存储点删除了。
(3)一旦提交事件发生,无论是显示或隐式提交事件,则所有现有的存储点都将会从内存中被删除。
建议:在数据库操作中当修改或是改动数据之后应该显示的commit,尤其是在多用户同时操作是commit是非常重要的,这样就会省去很多麻烦。