现在的位置: 首页 > 综合 > 正文

SCN基础

2013年09月20日 ⁄ 综合 ⁄ 共 2015字 ⁄ 字号 评论关闭

from:http://www.dbabeta.com/2010/scn-basics.html#more-241



SCN是什么

在《Concepts》中是这么描述SCN的:

system change number (SCN) is a logical, internal timestamp used by Oracle Database. SCNs order events that occur within the database, which is necessary to satisfy the ACID properties of a transaction. Oracle Database uses SCNs to mark the
SCN before which all changes are known to be on disk so that recovery avoids applying unnecessary redo. The database also uses SCNs to mark the point at which no redo exists for a set of data so that recovery can stop.

怎么理解这个“SCN(系统变更号)是供Oracle数据库使用的一个逻辑的、内部的时间戳”呢?要理解这个先需要理解Oracle中的事务(Transaction)和数据一致性(Data Consistency)的概念。

先说说数据一致性的概念。数据一致性指的是数据的可用性。比如说管理一个财务的系统,需要从A账户将100元转入到B账户,正常的操作是从A账户减去100元,然后给B账户加上100元,如果这两步操作都正常完成了,那我们可以说完成转账操作之后的数据是一致可用的;但是如果在操作的过程中出了问题,A账户的100元给减掉了,但是B账户却没有加上100元,这样的情况下产生的结果数据就有问题了,因为部分操作的失败导致了数据的不一致而不可用,在实际中肯定是要避免这种让数据不一致的情况发生的。在Oracle数据库中,保证数据一致性的方法就是事务。

事务是一个逻辑的、原子性的作业单元,通常由一个或者是多个SQL组成,一个事务里面的所有SQL操作要么全部失败回滚(Rollback),要么就是全部成功提交(Commit)。就像上面转账的例子,为保证数据的一致性,就需要将转账的两步操作放在一个事务里面,这样不管哪个操作失败了,都需要将所有已进行的操作回滚,以保证数据的可用性。进行事务管理是数据库区别于别的文件系统的一个最主要的特征,在数据库中事务最主要的作用就是保证了数据的一致性,每次事务的提交都是将数据库从一种一致性的状态带入到另外一种一致性的状态中,SCN就是用来对数据库的每个一致状态进行标记的,每当数据库进入到一个新的一致的状态,SCN就会加1,也就是每个提交操作之后,SCN都会增加。也许你会想为什么不直接记录事务提交时候的时间戳呢?这里面主要是涉及了两个问题,一个是时间戳记录的精度有限,再一个就是在分布式系统中记录时间戳会存在系统时钟同步的问题,详细的讨论可以查看Ordering
Events in Oracle

SCN在数据库中是一个单一的不断的随着数据库一致性状态的改变而自增的序列。正如一个时间戳代表着时间里面的某一个固定的时刻点一样,每一个SCN值也代表着数据库在运行当中的一个一致性的点,大的SCN值所对应的事务总是比小SCN值的事务发生的更晚。因此把SCN说成是Oracle数据库的逻辑时间戳是很恰当的。


SCN查看与转换

查看系统当前的SCN

Oracle数据库提供了两种直接查看系统当前SCN的方法,一个是V$DATABASE中的CURRENT_SCN列,另外一个就是通过dbms_flashback.get_system_change_number得到。

1
2
3
4
5
6
SQL>
col scn
for

9999999999999
SQL>
SELECT

current_scn scn
FROM

v$
database;
 
           SCN
--------------
 7046242302279
1
2
3
4
5
6
SQL>
col scn
for

9999999999999
SQL>
SELECT

DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER scn
FROM

DUAL;
 
           SCN
--------------
 7046242302616

如果你好奇心足够的话也许会执行下面的语句,然后发现一个“惊讶”的结果:

1
2
3
4
5
6
7
8
SQL>
col scn2
for

9999999999999
SQL>
col scn
for

9999999999999
SQL>
SELECT

current_scn scn,
DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER
scn2
FROM

v$

抱歉!评论已关闭.