Heim  >  Artikel  >  Datenbank  >  undo系列学习之读一致性(ORA-01555错误机制分析)

undo系列学习之读一致性(ORA-01555错误机制分析)

WBOY
WBOYOriginal
2016-06-07 17:17:59966Durchsuche

Oracle在读的过程中,数据是静止的,没有脏读,也就是,未提交的永远都不会被读到。我们可以理解为,Oracle在读的开始时,提前为

Oracle在读的过程中,数据是静止的,没有脏读,也就是,未提交的永远都不会被读到。我们可以理解为,Oracle在读的开始时,提前为他今后所要读的内容拍了一张”照片“,把所有内容全部定格在一个时间点上,,作为接下来读的依据。Oracle利用scn来实现这个理论,开始查询时,会确定一个select scn,这样就保证了事务槽里所有的scn都小于select scn。好比如,现在是12:21分,那么我之前所敲的字都在12:21分之前做的。

我们已经知道,undo段是循环使用,并且,Oracle只会把inactive的事务给覆盖。若是一个长时间的查询需要读到被覆盖的块时,就会报ora-01555错误。借助v$undostat里面的字段ssolderrcnt来查询在每个10分钟,Oracle内是否发生过01555错误。

下面是一张01555错误的图:

undo系列学习之读一致性(ORA-01555错误机制分析)

产生01555错误,原因有好多,这里列三个:

1)undo_retention不够大

2)undo空间压力大

3)sql性能差

下面我们来模拟01555错误。注意,这里要避免和30036错误相混淆。

会话1:

会话2:

会话1:

如果有数据,则证明查询是修改前的;如果没有数据,则证明查询是修改后的。但如果,此时undo里面没有数据,那就会报错。从查询输出,可知,查询是修改前的。

linux

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn