62,并发与多版本: 觉得这是数据库永恒的主题。一个数据的高低,都是体现在这里。至少对于开发者来说就是这样。
Oracle在并发上面,与其他数据库最大的区别是采用多版本的概念而不是锁来达到数据的一致性。这一点在看了之后。觉得真的是一个很天才的发明。
63.事务隔离级别。
常规的来说。事务隔离级别有Read Uncommitted,Read Committed,Repeatable Read和Serializable。
书中的关键点,我总结为以下几点。
第一,Read Committed是最低也是最常用的级别。因为Read Uncommitted的存在是为了无阻塞读。但是Oracle的多版本的理念。完全可以在Read Committed这个级别达成无阻塞读的效果。
第二。取得数据版本的时间,即发生的读请求的时间。能够说明的就是Serializable的读写。在书中P239页的例子正好说明了这个问题
64,在Serializable时,可能产生热表的I/O异常高。
这种问题很难复制。因为这种I/O异常,完全是由于Oracle实现Serializable的方式导致。并且只有在并发性比较高的情况下才会发生。
比方说A事务是Serializable的。那么它在运行。在A执行之前,关于A要涉及的表B有一千次修改。在数据库中的版本会“比较新”。因为一千次修改的结果是,Oracle需要不断的更新内存中的表B。但是A需要比较旧的版本。那么Oracle不得不不断的回到磁盘上对数据进行读写。
65写一致性。
大体上来说,和读一致性完全一样。不过写一致性会有个“重启动”的问题
“重启动”的原因在于多版本的。因为修改之前要做的是查询。比方说事务A和B更新同一样,其值为1.A先开始。获得值1,但是未提交。此时B也修改此行。获得值1.。因为A没有提交,所以来说B获得还是1。
如果A提交,B获得了运行的权利。但是数据已经变成了2。那么数据库就会再次运行一次查询。获得数据2.这就是重启动。