1)当读取的进程发现内存块正在被修改的时候(如果有x模式的buffer pin,就说明正在被修改),它只能等待,它不能clone块,因为这个时候内存块正在变化过程中ing,这个时候clone是不安全的。 楼主大才,文章相见恨晚,敢问上句话中提到的“内存块正在变化过程中ing,这个时候clone是不安全的”,这个信息楼主是从哪里获得的,有什么资料佐证么,希望不吝赐教!这个地方也困扰我很久! |
你好!~我有个疑问一直不懂~希望能得到解释!~ “写写”能会出现 buffer busy waits 很容易理解,但是在“读写”的时候我就不大理解了,当一个进程在写的时候不是会 clone 一个块么,这是不是就相当于构造了 CR 快?那么这时候读为什么不读CR块? |
good job! |
道理其实非常简单 1)当读取的进程发现内存块正在被修改的时候(如果有x模式的buffer pin,就说明正在被修改),它只能等待,它不能clone块,因为这个时候内存块正在变化过程中ing,这个时候clone是不安全的。很多人说,oracle里读写是互相不阻塞的,oracle可以clone内存块,把读写的竞争分开。其实要看情况,在读的时候发现内存块正在被写,是不能够clone的,因为是不安全的。这个时候读的进程只能等待buffer busy waits。 个人不明白,难道这个时候oracle不去构造cr块么? |
场景1虽然不会出现buffer busy wait,但会大量的latch: cache buffers chains |