当前位置:首页>开发>正文

mysql mvcc是什么 Mysql到底是怎么实现MVCC的

2023-04-10 16:54:40 互联网 未知 开发

mysql mvcc是什么 Mysql到底是怎么实现MVCC的

Mysql到底是怎么实现MVCC的

Mysql到底是怎么实现MVCC的
Mysql到底是怎么实现MVCC的?这个问题无数人都在问,但google中并无答案,本文尝试从Mysql源码中寻找答案。
在Mysql中MVCC是在Innodb存储引擎中得到支持的,Innodb为每行记录都实现了三个隐藏字段:

6字节的事务ID(DB_TRX_ID )
7字节的回滚指针(DB_ROLL_PTR)
隐藏的ID
6字节的事物ID用来标识该行所述的事务,7字节的回滚指针需要了解下Innodb的事务模型。

1. Innodb的事务相关概念
为了支持事务,Innbodb引入了下面几个概念:
redo log
redo log就是保存执行的SQL语句到一个指定的Log文件,当Mysql执行recovery时重新执行redo log记录的SQL操作即可。当客户端执行每条SQL(更新语句)时,redo log会被首先写入log buffer;当客户端执行COMMIT命令时,log buffer中的内容会被视情况刷新到磁盘。redo log在磁盘上作为一个独立的文件存在,即Innodb的log文件。
undo log
与redo log相反,undo log是为回滚而用,具体内容就是copy事务前的数据库内容(行)到undo buffer,在适合的时间把undo buffer中的内容刷新到磁盘。undo buffer与redo buffer一样,也是环形缓冲,但当缓冲满的时候,undo buffer中的内容会也会被刷新到磁盘;与redo log不同的是,磁盘上不存在单独的undo log文件,所有的undo log均存放在主ibd数据文件中(表空间),即使客户端设置了每表一个数据文件也是如此。
rollback segment
回滚段这个概念来自Oracle的事物模型,在Innodb中,undo log被划分为多个段,具体某行的undo log就保存在某个段中,称为回滚段。可以认为undo log和回滚段是同一意思。

Innodb提供了基于行的锁,如果行的数量非常大,则在高并发下锁的数量也可能会比较大,据Innodb文档说,Innodb对锁进行了空间有效优化,即使并发量高也不会导致内存耗尽。
对行的锁有分两种:排他锁、共享锁。共享锁针对对,排他锁针对写,完全等同读写锁的概念。如果某个事务在更新某行(排他锁),则其他事物无论是读还是写本行都必须等待;如果某个事物读某行(共享锁),则其他读的事物无需等待,而写事物则需等待。通过共享锁,保证了多读之间的无等待性,但是锁的应用又依赖Mysql的事务隔离级别。
隔离级别
隔离级别用来限制事务直接的交互程度,目前有几个工业标准:
- READ_UNCOMMITTED:脏读
- READ_COMMITTED:读提交
- REPEATABLE_READ:重复读
- SERIALIZABLE:串行化
Innodb对四种类型都支持,脏读和串行化应用场景不多,读提交、重复读用的比较广泛,后面会介绍其实现方式。
2. 行的更新过程
下面演示下事务对某行记录的更新过程:
1. 初始数据行

F1~F6是某行列的名字,1~6是其对应的数据。后面三个隐含字段分别对应该行的事务号和回滚指针,假如这条数据是刚INSERT的,可以认为ID为1,其他两个字段为空。
2.事务1更改该行的各字段的值

当事务1更改该行的值时,会进行如下操作:
用排他锁锁定该行

mysql和access的区别是什么

众所周知,PHP和ASP.NET是建站所需,前段时间小编已经和大家分享了企业建站选择这两者的区别可是有许多新手站长表示不清楚使用MySQL和Access数据库有何不同,今天小编就为大家简单分析一下两者的区别。
  MySQL和Access是什么?
  Microsoft Office Access是微软把数据库引擎的图形用户界面和软件开发工具结合在一起的一个数据库管理系统。它以自己的格式将数据存储在基于Access Jet的数据库引擎里。可以将数据直接导入或链接数据。Access支持visual Basic宏语言,是一个面向对象的编程语言,可以引用各种对象,包括DAO(数据访问对象),ActiveX数据对象以及许多其他的ActiveX组件。
  MySQL是一个开放源码的关系型数据库管理系统,关联数据库将数据保存在不同的表中,提高了速度MySQL使用的SQL语言是用于访问数据库的最常用的标准化语言。特性是体积小、速度快、成本低、开放源码,因为其开放源码,所以许多中小型网站为了降低网站总体拥有成本,于是选择MySQL作为网站数据库。
  MySQL和Access的区别
  MySQL特性:很便宜,通常是免费的网络承载少查询优化可以简便的应用程序通过MySQL做备份MySQL操纵简单,易上手,且为各种不同的资料格式提供有弹性的扩展界面(ODBC)。
  Access特性:简单易学,使用方便,开发效率高。
  价格:MySQL对于大多数用户而言是免费的,但是如果你以内嵌的方式使用MySQL或者是只使用MySQL的商业用途软件,你才会需要支付一小笔授权费。而Access的价格更贵一些。
  并发处理:Access可以处理的连接数目是无限制的,但是连接必须保持在并发处理的范围限制内MySQL内定最大连接数为100个使用者,但是即使网络上有大量的资料往来,也不会对MySQL上的查询优化造成太大影响。
  资料更新速度:在 Windows 98 上使用相同的硬件和数据尺寸,处理几十万笔资料的时候,MySQL的资料更新速度将明显快于Access 但是如果处理对象结构,Access将会优于MySQL当建立表格(table) 以及索引的时候,MySqL 会将表格锁住,如此一来会导致正在进行的大量资料处理速度慢下来,这会保证用户来访时的查询速度,且不会影响网站开发。
  结构的优化:MySQL仅需优化硬件条件,而不是MySQL本身Access的数据库非常的有效率,当然这也有赖于网站的结构设计MySQL不支持外键,优化时注意如何让存取IO减少到最低值、如何让一个或多个 CPU 随时保持在高速作业的状态、以及适当的网络带宽, 而非实际上的设计以及资料查询语句。
  数据备份:MySQL Dump 会产生一个比 Access 好很多而且也更可靠的备份档案。相比之下,在 Access中你只是将一个 MDB 档拷贝起来做备份。其次,即使 MySQL 的备份有部分损坏,复原起来也要比一个损坏的 MDB 档要容易得多了。
  资料处理能力:MySQL的资料处理能力比Access强eg:MySQL如果处理100MB的档案,不会发生承载过重的迹象,而Access就会造成网站效率低下。
  MySQL缺点:没法处理复杂的关联性功能不支持事务处理和事务的提交/撤销MySQL不支持外键以及参考完整性限制,因此MySQL不适用于有复杂资料关系的应用程序,但是Access可以而且MySQL也没有存储进程和触发器。当有许多表格需要同时在一个事务过程中完成更新的时候,MySQL的速度较慢。

mysql 这是什么mysql

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle公司。MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言。MySQL软件采用了双授权政策(本词条“授权政策”),它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库。由于其社区版的性能卓越,搭配PHP和Apache可组成良好的开发环境。
系统特性
1.使用C和C 编写,并使用了多种编译器进行测试,保证源代码的可移植性。
2.支持AIX、FreeBSD、HP-UX、Linux、Mac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统。
3.为多种编程语言提供了API。这些编程语言包括C、C 、Python、Java、Perl、PHP、Eiffel、Ruby和Tcl等。
4.支持多线程,充分利用CPU资源。
5.优化的SQL查询算法,有效地提高查询速度。
6.既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中。
7.提供多语言支持,常见的编码如中文的GB 2312、BIG5,日文的Shift_JIS等都可以用作数据表名和数据列名。
8.提供TCP/IP、ODBC和JDBC等多种数据库连接途径。
9.提供用于管理、检查、优化数据库操作的管理工具。
10.支持大型的数据库。可以处理拥有上千万条记录的大型数据库。
11.支持多种存储引擎。