深入浅出INNODB MVCC机制与原理_第1页
深入浅出INNODB MVCC机制与原理_第2页
深入浅出INNODB MVCC机制与原理_第3页
深入浅出INNODB MVCC机制与原理_第4页
深入浅出INNODB MVCC机制与原理_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、摘要:1、基础知识2、MVCC 实现原理以及视图化理解(包含些测试以便理解)3、深 MVCC 实现机制一、基础知识事务:事务是一组原子性sql mysql 对改事务单元内的所sql sql 语句才对数据生效,若sql 中任意不能执行或出错则事务操作失败,所有对数据的操作则无效(数据。事务有四个属性:1、原子性:事务被认为不可分的一个工作单元,要么全部正常执行,要么全部不执行。2、一致性:事务操作对数据库总是从一种一致性的状态转换成另外一种一致性状态。3、隔离性:一个事务的操作结果在内部一致,可见,而对除自己以外的事务是不可见的。4、永久性:事务在未提交前数据一般情况下可以回滚恢复数据,一旦提交

2、)数据的改变则变成永久(当然用update 肯定还能修改。ps:MYSAM (INNODB 、读锁:也叫共享锁、S 锁,若事务T 对数据对象A 加上S 锁,则事务T 可以读A 但不能修改A,其他事务只能再对A 加 S 锁,而不能加X 锁,直到T 释放A 上的S 锁。这保证了其他事务可以读,但在T 释放A 上的S 锁之前不能对A 写锁:又称排他锁、X 锁。若事务T 对数据对象A 加上X 锁,事务 T 可以读A 也可以修改A,其他事务不能再对A 加任何锁,直到T 释放A 上的锁。这保证了其他事务在T 释放A上的锁之前不能再读取和修改A。表锁:l大多数锁策略都支持(常见mysql ,是系统开销最低但

3、并发性最低的一个锁策略。事务t 对整个表加读锁,则其他事务可读不可写,若加写锁,则其他事务增删改都不行。行级锁:操作对象是数据表中的一行。是 MVCC 技术用的比较多的,但在MYISAM 用不了,行级锁用mysql 的储存引擎实现而不是mysql 大,处理高并发较好。多版本并发控制l。一般情况下,事MVCC 机制,以处理c 处理高并发能力最强,但系统开销比最大(这是最求高并发付出的代价。Autocommit:是 mysql 一个系统变量,默认情况下autocommit=1表示 mysql 把没一条sql 语句自动的提交,而不commit 语句。所以,当要开启事务操作时要把autocommit

4、设0,可以通过”来设置二、MVCC实现原理以及例化理解(包含些测试以便理解)第一:先mysql 第二版(中文版也、加粗标志出来,且给出测试证明。 Ps:这些只是外部看来的理解层面,深层次在第三点讲解-InnoDB 实现 MVCC 的方法是,它存储了每一行的两个(1)额外的隐藏字段,这两个隐时间开始,每个事物都会保存记录的系统版本号。依照事物的版本来检查每行的版本号。在事物隔离级别为可重复读的情况下,来看看怎样应用它。SELECTInnodb 检查没行数据,确保他们符合两个标准:1、InnoDB 只查找版本早于当前事务版本的数据行(也就是数据行的版本必须小于等于事务的版本,这确保当前事务读取的行

5、都是事务之前已经存在的是由当前事务创建或修改的行2被删除(2)符合了以上两点则返回查询结果。INSERTInnoDB 为每个新增行记录当前系统版本号作为创建ID。DELETEInnoDB 为每个删除行的记录当前系统版本号作为行的删除ID。UPDATEInnoDB 作为了删除行的版本。-不是两个,是三个。6byte DB_TRX_ID 的值,如 insert、delete bit 表示。 DB_TRX_ID 语句“showengineinnodbstatus”来查找,如下:-TRANSACTIONS-Trxidcounter0430621 Purgedonefortrxsn:o0430136un

6、don:oA.DB_TRX_ID DB_TRX_ID 的值是系统版本号的值,系统版本号是自动增加的,所以DB_TRX_ID A 事务开始后B 事务开始前有一个t 操作插入一行数据(没有、,B.DB_TRX_ID=A.DB_TRX_ID+1+1 1,其实并不矛盾,其实每一条 sql 操作可以当作一个事务,因为insert 操作是一个事务,A 事务之后新增2个事务, 所以是加2而不是1。2例化test 数据trx 代表改行数据是那个事务创建creat_num 是“创建时间”,也就是DB_TRX_ID 值dele_num id 为2 的数据行的C“删除”了改行。B事务有; 语句按照C原理该语句相当于

7、wherecreat_num=2011and(dele_num=NULLORdele_num2011),所以返数据是id为12行。D事务select*fromtest;则返回出id2的行。因2行被C事务删除了。例化2:UPDATEA 事务一条语句 。则先复制一条数据如蓝色框(然后把旧行数据的设commit 后则删除旧数据行例化3:DELET删除就是设dele_num= DB_TRX_ID-于加上和一位淘宝网友讨论一个问题(关于事务隔离级别,这里就直接贴不整理了)网友:请教个问题b的事务一定是按D 顺序提交么?D 为的一定在0的事务之后?笔者:这个问题我也不确定。我认为不是按顺序的可以这样想一下

8、,加a 事务很大是,然后还没t之前有d为的事务b 并发开始处理,但b事务很小处理完了,如果要等a 事务的话则是一个鸡肋了当然还有考虑锁的问题,如a 事务设置了排他锁且b事务有写操作那不事务则在等待队列中了,t的顺序肯定 a 然后b 的!网友如果是这样的话假设三个事务最先提交了这时新事,应该能看的更改,而如果按当前活跃D 的最小的比较(这时0,那就看不的更新。笔者:结合事务隔离级别:1D D 不适用C读可以读到其他事务修改甚至未提交的D D ,其他事务对数据库的修只要已经提其修改的结果就是可见的与这两个事务开始的先后顺序无关,不完全适用C读,像你说0的的是可以(按照C理论应该不行的但适2(能MV

9、CC 理论。REPEATABLE ,见4、 SERIALIZABLE ,完全不适合适用,这样所有的query 都会加锁,再它之后的事务都要等待MVCC 只工作在REPEATABLE READ和 READ COMMITED隔离级别下-于加上MVCC 实现机制1creat_num DB_TRX_ID 去比较获取事务的话,按道理在一个事务 比 A 后,但 A 还没 commit)select 的话 B.DB_TRX_IDA.DB_TRX_ID 则应该能返回A 事务对数据的操作以及修改。那不是和前面矛盾?其实不然,只是前面没有讲到以下内容。B每个事务在开始的时候,会将当前系统中的活跃事务列表)创建一个

10、副本w,然后一致性读去比较记录的d的时候,并不是根据当txid readview 最早一个事务的txid(readview-up_limit_id)B 事务都是看不到的。当然,这里还有个小问题要处理一下,就是当前事务自身的变更还是需要看到的。在storage/innobase/read/read0read.c 中 实 现 了创建readview的 函数中实现了判断一致性读是否可见的read_view_sees_trx_id代码:read_view_t* read_view_open_now(/*=*/trx_id_tcr_trx_id,/*!in:trx_idofcreating mem_he

11、ap_t*heap)/*!trx_list),heap);view-creator_trx_id=cr_trx_id;view-type=VIEW_NORMAL;view-undo_no=0;/*Nofuturetransactionsshouldbevisibleintheview*/ view-low_limit_no=trx_sys-max_trx_id;view-low_limit_id=view-low_limit_no;n=0;trx=UT_LIST_GET_FIRST(trx_sys-trx_list);/*Noactivetransactionshouldbevisible,e

12、xceptcr_trx*/while(trx)if(trx-id!=cr_trx_id&(trx-conc_state=TRX_ACTIVE|trx-conc_state=TRX_PREPARED)read_view_set_nth_trx_id(view,n,trx-id);n+;/*NOTEthatatransactionwhosetrxnumberismax_trx_idcanstillbeactive,ifitisinthemiddleofitscommit!Notethatwhenatransactionstarts,weinitializetrx-notoIB_ULONGLONG_

13、MAX.*/if(view-low_limit_notrx-no)view-low_limit_no=trx-no;trx=UT_LIST_GET_NEXT(trx_list,trx);view-n_trx_ids=n;if(n0)/*Thelastactivetransactionhasthesmallestid:*/view-up_limit_id=read_view_get_nth_trx_id(view ,n-1); elseview-up_limit_id=view-low_limit_id;UT_LIST_ADD_FIRST(view_list,trx_sys-view_list,

14、view);return(view);2、MVCC 如何控制update 操作前面说先复制新数据,并插入DB_TRX_ID DB_TRX_ID 现在先介绍几个概念:DB_ROLL_PTR7byte 回滚指针。redo log:重做日志,就是每次mysql 在执行写入数据前先把要写的信息保存在重写redo_log 中的信息重新写入数据。undolog :撤销日志,与redolog 恰恰相反,当一些更改在执行一半时,发生意外, 而无法完成,则可以根据撤消日志恢复到更改之前的壮态。mvcc 中 update 步骤:1、记录事务中修改行数据的相应字段和(包括旧版本事务undo-log 中记录。2、 修

15、改相应数据。3、 在 redo-log 中保存要修改的相应(新版本事务id)数据写入以上骤详细代码内容可看: HYPERLINK /gao1738/blog/item/dcec39d6185af2049d163d8c.html /gao1738/blog/item/dcec39d6185af2049d163d8c.html4update 不能正常运行怎根据undo-logredo-log 来回复5、当然如果当前版本事务没有commit 的话则通过 undo-log 信息恢复原始数据状态终于写完了, 笔者用了一个多星期, 若有什么纰漏的地方, 请多多指教! HYPERLINK mailto:445235728 445235728(benwin)参考文献:mysql 第二版(中文版

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论