Oraclecommit和checkpoint区别讲解
事务在没有提交或者回滚之前对于其他的用户会话是看不到的,即数据修改了但是对于其他人是不可见的,因为没有提交。提交了的数据还是可能在内存,未提交的数据也可能在磁盘。在未提交之前发出alter system checkpoint,那么所有修改了的数据块都写到磁盘上面了,虽然未提交,但是数据还是写到磁盘上面了,因为未提交,其他会话依旧看不到数据修改的变化。
对于一个事务的提交与否和在磁盘,内存没有任何关系。对于commit来说是来保证数据的永久的改变,这些改变在磁盘还是在内存改变都不重要,总之就是改变了。
Checkpoint就是将内存凡是修改过的数据块就写到磁盘上面,修改的数据块有两种情况,一种是修改完提交,一种是修改完未提交。所以checkpoint只管将修改了的数据块写到磁盘上面。
事务发出一个commit之后,这个时候Oracle就认为将这个数据块永久的改变了。commit表示事务的结束,事务的结束就意味着别人对操数据的结果可见。哪怕修改了100W条记录没有commit,对于其他的用户依然查看不到修改了的数据。commit标识事务的结束,标识修改数据的生效,生效是在内存生效还是磁盘生效都不重要。
总结:commit就是让事务提交,让事务生效,让修改过后的数据对于其他用户可见。如果生效的数据在磁盘上面,别的用户查的时候就去磁盘上读取出来,如果生效的数据在内存里面,那么在内存里面就是可以看到的。
commit之后不是将修改过后的脏数据块写到磁盘上面,redo log开始是放在内存里面的,commit之后会强迫log buffer里面的redo log无条件的必须写到磁盘上面。只有磁盘写成功了commit才会返回给客户端提交完成的信息。在Oracle里面数据是由redo来保护的,为什么不将修改了的数据直接写到磁盘上面,为什么还要让redo去写。因为写redo速度快,redo是顺序写的,是从一个文件从头写到尾。而要将数据块写到磁盘上面,先要去磁盘上面找数据块的位置,然后再写入,这样非常耗时。一旦redo信息写到磁盘上面就没有问题了,即使数据块丢失了,也可以通过redo找回来。
redo一写到磁盘上,这个数据就安全了,既然安全了为什么还要checkpoint呢?
第一:就是给别人让位置,脏数据会越来越多的,最后内存会放不下,所以脏数据最后还是得刷到磁盘上面给其他新产生的脏数据让出位置。
第二:在恢复的时候减少时间,redo是可以将数据保护起来,如果有大量的数据都在内存里面,比如说有好几个G的数据在内存里面没有刷到磁盘上面,数据库坏了恢复的时候因为大量数据的丢失到导致恢复的时候需要很长时间。所以checkpoint就是将一些数据及时的写到磁盘上面,一旦写到磁盘上面就不需要恢复了。
那么是否要通过checkpoint经常来将脏数据写到磁盘上面呢?效率的问题,因为频繁的写到磁盘上面是随机写I/O,效率低。
在数据库的数据安全的保护通过两种方式保护,一种是lgwr这个后台进程来保证redo的数据的安全。另外一种是通过checkpoint的方式来保证脏数据的安全。
推荐阅读
-
select count()和select count(1)的区别和执行方式讲解
-
Python中extend和append的区别讲解
-
SQL2005中char nchar varchar nvarchar数据类型的区别和使用环境讲解
-
OpenGL关于glStencilFuncSeparate()和glStencilFunc()函数的区别讲解
-
SQLSERVER全文目录全文索引的使用方法和区别讲解
-
Shell中exit和return的区别讲解
-
有关javascript中Null和Undefined的区别讲解
-
js中null和undefined的区别讲解
-
JavaScript中.min.js和.js文件的区别讲解
-
故事形式讲解javaScript中创建对象和Java创建对象的区别