MVCC多版本并发控制
原理:
mvcc提供基于某个时间的快照,使得对于事务看来,总是可以提供与事务开始时刻相一致的数据,而不管这个事
务执行的时间有多长,故在不同事务看来,同一时刻看到的相同的行数据可能是不一样的,即:每一行数据会有
多个版本数据(副本)
InnoDB中每行隐含2个字段:更新或修改版本号和删除版本号(可以为空),每一个事务开始也有自己的版本号且是递增(
类似于SCN)
以select,delete,insert update语句来说明:
1)select 同时满足2个条件的行,才能被返回:
*行的被修改版本号<=该版本号
*行的被删除版本号要么没有被定义,要么大于事务的版本号:行的删除版本号如没被定义,说明行没有被删除过;如删除
版本号>当前事务的版本号,说明该行的是被该事务的后面启动事务删除过(接着看下去..)
2)insert
对新插入的行,行的更新版本被修改为该事务的版本号
3)delete
对于删除,innodb直接把该行的被删除版本号设置为当前事务版本号,相当于标记删除,不是实际删除
4)update
在更新行的时候,innodb会把原来的行复制一份到回滚端的表空间中,若成功,并把当前事务的版本号作为该行
的更新版本号,否则rollback;
mvcc优缺点:
在读取数据时,innodb几乎不用获取任何锁,在每个查询通过版本检查,只获取需要的数据版本,提高系统并发度
缺点:为了实现多版本,innodb必须对每行增加相应字段来存储版本信息,同时需要维护每一行的版本信息,而且
在检索行的时候,需要进行版本的比较,因而减低了查询效率;innodb还需要定期清理不再需要的行版本,及时回收
空间,这也增加开销;
innodb支持事务隔离级别:
1)read uncommitted: (读没有提交的数据),无法避免脏读;
2)read committed: (只能读提交的数据),其他事务对数据库的修改,只能已提交,其修改的结果可以看见,与这2个事务
开始的先后顺序无关,这个级别避免脏读,无法实现可重复读,可能会产生幻读
不可重复读:t1:读取一行 t2:再读取这行时,可能被修改了,看不到啦
幻读:t1:读取有一行,t2:再读取相同数据时,比t1时间多了数据
3)repeatable read:(可重复读),只能读取在它开始之前提交事务对数据库的修改,在它开始之后,所有其他事务对数据库
的修改对它来说均不可见.
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26855487/viewspace-765514/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26855487/viewspace-765514/