Oracle数据并发性和一致性
Oracle数据库的一致性是通过多版本一致性模型和多种类型的锁和事务来实现的。Oracle的多版本一致性读,使得Oracle查询具有读一致
1.Oracle数据库的一致性是通过多版本一致性模型和多种类型的锁和事务来实现的。
2.Oracle的多版本一致性读,使得Oracle查询具有读一致性查询和非阻塞读两个特性。
3.语句级的一致性指查询返回的结果与发起查询的时间点保持一致并且当时已提交的数据。例如:当SQL语句在SCN=1000发起,则在提交读的隔离级别下,返回的结果和SCN=1000保持一致;在序列化或者只读的事务中,事务中所有的查询都与事务开始时间点保持一致;在闪回查询中,查询结果和语句中指定的时间点保持一致。
4.事务界别的一致性:
即Oracle可以保证事务中的所有语句查询的结果和事务开始时间点保持一致。
串行化事务中的查询可以看到事务自身引起的修改。
事务级别的一致性可以保证可重复读,但是不保证幻影读。
5.读一致性和undo段
Oracle的读一致性和非阻塞读主要通过undo来实现,在undo段中存放事务所做的修改的旧值,这样某事务进行过程中,可以对事务外查询提供旧值的查询,即读一致性。
6.读一致性和事务表
每个数据块的块头都有一个ITL(interested transaction list),当Oracle需要对数据块进行修改时,会利用ITL来判断事务是否提交。(Oracle默认的隔离级别为提交读,不会读取未提交事务的数据)
ITL里的内容描述了哪些事务在数据块中有行锁和哪些行被已提交或未提交事务做了改变。
ITL指向UNDO段里的事务表,事务表里记录了数据库发生的所有改变的时序。
从某种意义上来说,ITL里记录了最近数据块里所有的被改变行记录的历史信息,INITRANS参数决定了数据块里保留的事务历史。
7.锁机制
一般来说,多用户的数据库使用数据锁来解决与数据并发性、一致性和完整性相关的问题。锁主要是阻止访问相同资源的事务之间发生破坏性的影响。
8.ANSI/ISO的事务隔离级别
其中,,脏读是指读取到其他事务未提交的数据;不可重复读是指第二次读时,比第一次读数据被删除,第一次查询结果有改变;幻影读是指第二次查询时,查询结果比第一次更多,但是第一次查询的结果集没有发生改变。
9.read commited隔离级别
oracle为每一条查询语句提供一致性的查询结果,不需要人工干预。
例如update语句中的where字句查询,也是可以提供一致性查询结果的,只是该隐式查询并不能看到自己的修改,只能看到隐式查询之前发生的修改。
如果在select列表中含有函数(如count(),sum(),自定义函数),则 函数中的每一条SQL都将在语句级实现一致性,而不是在父select语句级保持一致性,函数内的每一条SQL语句在执行时,”一致性读快照“都已经建立。也就是说,select列表里的函数的执行过程中,会读取其他事务提交的改变。例如,某select列表含有10个函数,均对一张表进行操作,事务总共执行时间为1小时,在这一小时中若有其他用户对该表进行了修改并提交,则后面的函数(例如最后一个函数)则将读到其他用户修改后的数据。
10.提交读事务中的写冲突
当一个事务A尝试去修改某未提交事务B所修改的数据块,则发生了写冲突,A事务会等待B事务结束(回滚或提交)释放相应锁后,再继续执行。这里有两种情况:第一,当B事务回滚了,则A事务继续处理之前被锁定的行数据,就像B事务从来没有发生过一样;第二,当B事务提交了,则A事务继续执行其之前想要处理的行记录。
11.串行化隔离级别
串行化隔离级别下,事务只能看到事务开始时间的已提交改变和事务自己看到的改变。串行化事务仿佛没有其他事务在对数据库进行修改。
串行化事务使用的场景:第一,事务较短且处理的记录数较少;第二,俩事务同时处理相同记录的几率较低;第三,运行时间相对较长的事务主要都是只读事务。
串行化事务只会处理事务开始时,已经提交的数据,当串行化事务处理其他未提交事务修改的数据时,会报错。“ORA-08177: Cannot serialize access for this transaction“
12.只读隔离级别
只读隔离级别类似于串行化隔离级别,只是只读隔离级别不会修改数据(SYS用户除外);
只读事务主要用于要求报表内容数据必须和开始报表时间保持一致的场景。