ITPub博客

首页 > 数据库 > Oracle > oracle 事务

oracle 事务

原创 Oracle 作者:winston_DBA 时间:2015-04-19 22:57:49 0 删除 编辑
1.事务是一个包含一条或多条SQL语句的逻辑的原子单元,即要么全部提交,要么全部回滚。
2.oracle数据库给每个事务分配一个事务ID(transaction ID)
3.事务的四大属性:原子性(atomicity)一致性(consistency)隔离性(isolation)持久性(durability)
     原子性:事务中的操作,要么全做要么全不做,例如更行1000条记录,若更新到500行失败,则回滚,就像500条从来没被更新过一样;
     一致性:事务使得数据库从一个一致性状态到另一个一致性状态;
     隔离性:一个事务在提交前,对于其他事务是不可见的;
     持久性:一旦事务提交,则事务所做的修改是持久性的。
4.事务的组成:
     事务由一条或多条组成在一起用于原子性地修改数据库的DML语句(select除外)组成;
     或者事务由DDL语句组成。
5.事务的开始
     由第一条可执行的SQL语句开始。可执行的SQL语句为DML语句、DDL语句或者set transaction语句。
     当事务开始后,数据库为事务分配undo段,当undo段和事务表(transaction table slot)分配完成后,oracle为事务分配唯一的事务ID。
6.oracle中的事务可以通过v$transaction来查看。
7.事务的结束
     当用户提交或者不带检查点的回滚操作,事务结束;
     当用户执行DDL语句,如CREATE   DROP   RENAME或ALTER时,数据库会触发隐式提交;
     当用户从大多数连接oracle工具(如sql*plus等)断开连接或者连接oracle的应用程序断开连接时,会触发一个隐式提交;
     当客户端进程异常结束,则oracle会自动回滚相关事务。
8.语句级原子性
     oracle支持语句级原子性,也就是说每一条可执行SQL语句(DML/DDL/SET TRANSACTION)语句都被视为一个独立的事务。
     语句级原子性的事务发生回滚后,并不会对其他语句造成影响;
     当某语句级原子性事务发生回滚后,对于数据库来说,就像该语句从来没有发生过一样;
     语句级原子性事务回滚最常见的例子为:插入与主键约束冲突的数据、造成死锁的SQL语句等。但是没有通过语法或语句检查的SQL语句,由于oracle并没有真正的执行该语句,所以并不会造成语句级原子性事务的回滚。
9.system change number
     SCN为oracle的内部一个逻辑的时钟,用于将oracle内部发生的事件进行排序。也就是说SCN值小的事件较早发生,SCN值相同的事件,意味着同时发生。
     每个事务都会有一个SCN,也就是说一个事务内的多个修改(例如update)拥有相同的SCN值。当事务提交时,oracle又会记录一个SCN值。
     当一个事务修改数据后,oracle会将此时的SCN值写入和该事务对应的UNDO段内,LGWR会将事务的提交的记录信息写入online redo log中。
     oracle使用SCN来进行实例恢复和介质恢复。
10.事务控制
     COMMIT:提交使事务中做的改变持久化,并且提交还会清除事务中的所有检查点和释放事务相关的锁资源;
     ROLLBACK:回滚会使自从上个COMMIT或者ROLLBACK以来发生的改变全部撤销;
     ROLLBACK TO SAVEPOINT:该操作会使自指定的保存点以来发生的改变全部被撤销,但是并不撤销事务所有改变;
     SAVEPOINT:指定一个后续可以回滚的点。
11.事务名
     事务名是用户指定的一个标记,通过set transaction name '......'语句来指定。
     事务名以下优势:
     方便监控长时间运行的事务,也方便解决可疑分布式事务;
     在OEM等工具中可以更加方便的对系统活动进行监控,因为事务名会和事务ID一起显示;
     oracle会将事务名写入redo审计记录中,方便后续的日志挖掘;
     可以通过事务名在V$TRANSACTION视图中查找事务的相关信息。
12.活动事务
     活动事务是指已经开始但是还未提交或者回滚的事务;
     活动事务中涉及到的数据的状态:
     活动事务会在SGA中生成undo块(data buffer cache中);
     活动事务还会产生online redo log buffer 数据,用于保护改变的块和undo块;
     已提交的事务会将事务中的数据改变写入数据缓冲池中,但不一定会被立即写入到数据文件中。
     活动事务中涉及到的记录,将会被该事务锁定,不允许其他事务进行修改,并且其他事务也不会读到活动事务所做的修改。
13.保存点
     保存点是用户自定义的在事务中间的一个标记,保存点在oracle内部和一个SCN值关联。保存点将一个事务分成多个部分。
14.事务的回滚
     当回滚整个事务,而不是回滚到某个保存点,会有以下操作:
     利用回滚段,撤销事务里的所有SQL操作相关的改变;
     释放事务中涉及的所有锁资源;注意:回滚到某个保存点,并不会释放事务中之前获取的锁!
     擦除事务中的所有保存点;
     结束当前事务,使数据库回到事务开始时的一致性状态。
15.事务的提交
     当提交一个事务时,会使事务中涉及的所有改变都持久化。
     提交事务时,将进行如下操作:
     为提交产生一个SCN;
     LGWR将redo缓存中剩余的redo信息写入到online redo log文件中,并且将事务的SCN写入到online redo log中;
     oracle释放事务相关的锁;
     oracle删除事务相关的所有保存点;
     oracle进行提交清理;
     结束事务。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30167136/viewspace-1586341/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: oracle 锁机制
请登录后发表评论 登录
全部评论

注册时间:2015-03-17

  • 博文量
    76
  • 访问量
    414948