-- 创建表和插入数据:
CREATE TABLE stu(
  id VARCHAR(10) NOT NULL,
  name VARCHAR(20) NOT NULL,
  age VARCHAR(10) NOT NULL
)engine=INNODB;INSERT INTO stu(id,name,age) VALUES('1','张三','20');
INSERT INTO stu(id,name,age) VALUES('2','李四','20');
  ..
  ..
  ..
INSERT INTO stu(id,name,age) VALUES('50000000','王五千万','20');-- 这个表的数据量有 五千万 行. 
-- ----------------------------------------------------------------
-- ----------------------------------------------------------------隔离级别为:Repeated Read 引言 1:
   MVCC保存了某一时刻数据的一个快照。意思就是无论事物运行了多久,它们都能看到一致的数据。
问题 1:
  根据引言1:因为表特别大,MVCC怎么可能在同一时刻,快照到所有到数据,扫描全表快照也需要一定的.
            那在这段时间里,另一个session在修改数据,怎么能保存数据的一致性呢?

解决方案 »

  1.   

    刚刚问题一描述的不清楚,现在重新描述下
    问题 1:
    根据引言1:因为表特别大,MVCC怎么可能在同一时刻,快照到所有到数据,扫描全表快照也需要一定的时间.
    那在这段时间里,另一个session在修改数据,怎么能保存数据的一致性呢?
      

  2.   


    请问一下,这个MVCC是跟LVM实现的原理是一样的吗?
      

  3.   

    不知道。但至少MVCC是由数据库系统来实现的。 而你所说的LVM估计是指操作系统上的吧。它是由UNIX或LINUX来实现的。
      

  4.   

       在附加一个小问题。请狼头哥指教...   关于INNODB的存储引擎   1.在mysqldump 的过程中,使用--single-transaction参数.是利用的MVCC的快照功能吗?
      
       2.这个--single-transaction是否能实现传说中的热备份功能呢?
     
       3.如果以上2个成立,那么使用--single-transaction热备份,是否要把innodb的事务日志一起快照呢?请问在mysqldump里面是怎么快照事务日志呢?
      

  5.   

    MVCC(Multi-Version Concurrency Control)多版本控制,其实就是一个乐观锁。在数据操作的时候,流程如下
    1:SESSION1读出ID=1的记录,VALUE=100,得到一个数据VERSION=1;
    2: SESSION1读出ID=1的记录,VALUE=100,得到一个数据VERSION=1;
    3: SESSION2修改ID=1的记录,VALUE=VALUE+100,版本号加1为2,比上一个要大,那么只需更新更新操作。
    4:SESSION1修改ID=1的记录,VALUE=VALUE+100,版本号加1为2,和上一个版本2一样大,修改失败。这样在并发操作的时候,第4步是失败的,这样避免了VALUE不正确的情况。
      

  6.   

    MVCC就是在每行的时候增加了两哥version,insert version和delete version,会在update这行的时候copy出一个新行,update新行,更新旧行的delete version和新行的insert version。
    建议阅读high performance mysql