ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 浅谈数据的并发性访问和数据的一致性(1)

浅谈数据的并发性访问和数据的一致性(1)

原创 Linux操作系统 作者:icer_repls 时间:2011-05-17 02:17:27 0 删除 编辑
    之前阅读数据库原理方面的书籍时,就了解过数据的并发性访问和数据的一致性。今天在阅读oracle concept时,也发现了相关知识。基本上和原理书上说的一致,其实这也很正常,因为每个特定的数据库版本都是基于原理实现的,然后加了一点自己的特色而已。
    数据的并发性访问就是指多个用户同时访问相同的数据(Data concurrency means that many users can access data at the same time)。
    数据的一致性是指每个用户都能取得具备一致性的数据,同时还能看到自己对数据的相关修改(Data consistency means that each user sees a consistent view of the data, including visible changes made by the user's own transactions and transactions of other users.)。

    那么用户的操作在不采取任何其他措施之前会出现什么问题(就是不一致性读)呢?
            1.脏读,就是说一个事务修改了某个数据,而在这个事务提交之前(即没有真正写入磁盘之前)另外一个事务也读了这个数据,那么这叫脏读。
            2.不可重复读,一个事务t1读取了某个数据,然后过了一会儿需要再次读取这个数据时,这个数据已经被其他事务t2改变。两次读的不一样,这叫做不可重复读。
            3.幻影读(个人感觉这个翻译挺怪得),就是我们在查询某个特定条件数据时,这个结果集里面包含了其他事务新插入的数据。

    为了保证并发性访问和数据的一致性我们就需要解决上面提到的三种问题。oracle中是利用多版本的一致性、事务和锁来解决的。
    锁,可以利用现实中的理解,将某个事物锁住之后,就只能由那个加锁的人来使用这个事物了。而在数据库中这个加锁的人就是我们的用户,当然这数据库中还有一个特殊的地方,所分为排他锁和共享锁(一个对象可以被多个用户同时加共享锁,但是共享锁不可以和排他锁同时存在)。同时在oracle中有个特殊的地方,oracle不为读操作加锁,这样做的目的是提高oracle吞吐率和性能。
    多版本并发访问控制,oracle自动实现了查询的读一致性,即一个查询来自于同一个时间点,这个称为语句级别的读一致性,还有事务级别的读一致性,在串行模式下,即事务内所有数据访问反映的都是事务开始时的数据状态。我个人认为语句级别的读一致性就是事务级别的读一致性的一个特殊情况(此时这个事务只有一条语句)。
    事务,具有原子性(要么全部执行commit,要回全部回滚undo)。隔离性,即对别的事务来说是透明的(计算机中的透明是指看不到)。还有一致性和持久性。简称ACID。
    接下来重点说隔离性,在oracle中有三种隔离级别:提交读、串行化、只读模式。
    提交读就是说:事务执行的查询只能看到这个事务开始之前已经提交了的数据,这样不会出现脏读。
   串行化:事务之间的执行时串行的,一个执行完成或回滚之后才能开始另外一个(当然是这两个事务之间存在竞争自然的前提下,否则肯定可以并发执行这两个事务)。
    只读模式:只能看到事务执行以前提交的事务的数据,而且不能执行DELETE,UPDATE,INSERT.
    利用set transtion isolation level 来设定隔离级别。我们常用的两种隔离级别是提交读(这也是oracle默认的)和串行化。
    这个主题的内容也是相当的多,我自己也是粗略的了解(不过我觉得了解一下原理就够了),所以我只是做了一个大致的总结。今天就到此为止。鉴于篇幅的原因,我将在下一篇日志里面将这个主题的内容继续补上.

   下一篇将会介绍提交读和串行化的差异、锁的更多知识、静默数据库等等

    哈哈,累了 睡觉去.

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25701553/viewspace-695521/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-04-16

  • 博文量
    20
  • 访问量
    71820