事务的隔离级别:
可能允许或者不允许的三种现象
隔离级别是根据三个现象来定义的:
Dirtyread:脏读,也就是说,可以读取未提交的数据。
我不知道其他的数据库是否支持,但是我知道oracle肯定是不支持的
Oracle的事务有isolation的特点,只要你没有提交,那么任何人都看不到你对数据的改动
Nonrepeatable read:如果在T1时间读取某一行,在T2时间读取这一行的时候,这一行可能已经被修改了,被删除等等
这是什么意思?
What does that suppose to mean?
当然是这样了丫
幻象读:phantom read:
在T1执行一个查询,在T2再执行这个查询的时候,此时可能已经向数据库添加了另外的行,这回影响我的查询结果
我不明白,这是什么意思?
这当然会影响我的查询结果了
Of course it will affect my query results
But what I don’t know is that if it’s inone transaction then what?
I was selecting table A in time 1
Then I select table A in time 2
But table A was changed in time 2
So ,what then?
In my old opinion ,it will be like just thetruth ,you know , in oracle
And 在幻象读中,已经读取的数据不会改变,如果有新增的数据,那么会添加进来
Oracle支持哪些?
我认为oracle一个也不支持丫
这里有一个让我很疑惑的新的名词
Read consistency
So,what exactly is read ,consistency
I see the oracle concepts ,and I see thetransaction-level read ,consistency,and statement-level consistency
And what is it exactly?
I also see that if a transaction is notcommited ,and select the table
Then you got the old data using the undosegment
And I also notice that the oracl e database
So what is read consistency exactly?
经过昨天的学习和我昨天晚上的思考
读一致性:
也就是说:在相同的时间点上,所有的数据库用户查询数据的结果都是一样的
其中有一个很明显的东西
也就是说,我们在查询数据的时候,
When we do the select ,it will be an scn
We will
一个select语句初始化的时候,oracle会给它添加一个实时的SCN号,查询的结果将会是在这个SCN点上的数据
在buffer cache中的datablock也有自身的SCN号,,oracle会查看SCN号,然后检查是否符合查询,如果不符合查询的SCN号,就会使用REDO来重建数据
Oracle读一致性:
1:多版本读一致性:
在oracle数据库中,多版本控制是同事实现多版本数据的能力。
Oracle数据库支持多版本读一致性:
也就是说数据库的查询具有以下特点:
1:读一致性查询
查询返回的数据是提交过的数据,而且在单一时间点是一致的。
Oracle读不会阻塞写,read进程和write进程不会相互阻塞
2:语句级别的读一致性
Oracle可以实现语句级别的读一致性,保证的而是,在单一时间点上,查询返回的数据是一致的。
一致性的SQL语句对应的时间点取决于事务的隔离级别和查询的属性
如果在read commited隔离级别:时间点是语句开始的SCN,如果这个语句在SCN100处开始,那么这条语句就和SCN100同步
在serializable级别的事务中,时间点取决于事务开始的时间,比如说transaction开始于SCN100,那么这个事务中的所有查询都是在时间点SCN100上
Oracle本身支持两种事务隔离级别:readcommited and serialization
3:事务级别的一致性读
Oracle 能够在一个事务中提供给所有查询一致性读
这个意思是:事务中所有的查询都会返回同一个时间点的内容,就是事务开始的时间点。
串行化的事务的查询能够看到事务本身对数据的改变。
4:一致性读和UNDO SEGMENTS
为了管理多版本杜一致性的模型,database必须创建一系列的读一致性的数据,当一张表被同时查询和升级的时候。
Oracle使用undo data来实现这个目标。
当一个用户修改数据的时候,oracle database创建undo entries,写到undosegments中。
Undo 段中存储了被修改数据的值。因此,相同数据的多个版本,因为时间点的不同,可以存在于数据库中。Oracle可以使用不同时间点的数据的快照来提供一致性读的数据的视图。
Oracle使用查询检索data block的时候,oracle确保每一个block里的数据都代表了当查询开始的数据。Oracle会回滚到需要的时间点的block。
Oracle使用了一种叫做SCN的机制来保证transaction的顺序,select语句执行的时候,oracle会决定查询开始执行的SCN号。
Select语句需要和commited一致的block。Oracle会把最近的data block复制到新的buffer中,应用Undo data来重建老版本的数据。这些重建的data block叫做一致性读克隆。
奥,我看明白了,是把最新的数据拿出来,然后使用undo 段来重建
本文出自 “原歌轩” 博客,请务必保留此出处http://yuangeqingtian.blog.51cto.com/6994701/1371458