翻译:多版本并发控制

Multiversion concurrency control


多版本并发控制

Multiversion concurrency
control
 (MCC or MVCC),
is a concurrency
control
 method commonly used by database
management systems
 to provide concurrent access to the
database and in programming languages to implement transactional
memory
.[1]

多版本并发控制(简称MCC或者MVCC),是一种并发控制思想,通常被用于DBMS中去保证并发连接数据库,或者去实现事务内存编程。

If someone is reading from a database at the same time as someone
else is writing to it, it is possible that the reader will see a
half-written or inconsistentpiece
of data. There are several ways of solving this problem, known
as concurrency
control
 methods. The simplest way is to make all readers
wait until the writer is done, which is known as a lock. This
can be very slow, so MVCC takes a different approach: each user connected
to the database sees a snapshot of the
database at a particular instant in time. Any changes made by a writer
will not be seen by other users of the database until the changes have
been completed (or, in database terms: until the transaction has
been committed.)

如果在一个库中,有人读,同时也有人写,很可能读操作会获取到写入一部分的内容,或者不一致的数据片段。有好几种方法可以解决这个问题,都采用并发控制思想。最简单的方法是加锁,让读操作一直等待直到写入结束,但这会导致读写非常慢。MVCC采用另一种思路,访问数据库的每个用户都将看到一个特定时刻的数据库快照。写操作进行的修改,不会被其他用户看到,直至修改完成(在数据库中,直至事务被提交)

When an MVCC database needs to update an item of data, it will
not overwrite the old data with new data, but instead mark the old data as
obsolete and add the
newer version elsewhere. Thus there are
multiple versions stored, but only one is the latest. This allows readers
to access the data that was there when they began reading, even if it was
modified or deleted part way through by someone else. It also allows the
database to avoid the overhead of filling in holes in memory or disk
structures but requires (generally) the system to periodically sweep
through and delete the old, obsolete data objects. For a document-oriented
database
 it also allows the system to optimize documents by
writing entire documents onto contiguous sections of disk—when updated,
the entire document can be re-written rather than bits and pieces cut out
or maintained in a linked, non-contiguous database structure.

一个支持MVCC的数据库更新某一项数据的时候,它不会直接用新数据去覆盖原数据,而是将原数据标记为废弃,并且把新数据写在其他地方,这样就有多版本的数据同时被存储,但是只有一个是最新的。MVCC允许一个读会话开启之后,连接依然可以查看数据,即使它被其他操作修改或者删除。MVCC让数据库避免直接填写内存的空洞,或磁盘的结构(即被标记为脏数据的部分),一般请求系统周期性换出将脏数据删除。对于一个文件类型的数据库来说,系统通过把整个文件写入相似的磁盘区,更新完成后,整个文件被重写的方式来修改磁盘结构,而非一点一点截取或被链接在一个完全不同的磁盘结构。

MVCC provides point in
time
 consistent views. Read transactions under MVCC
typically use a timestamp or transaction ID to determine what state of the
DB to read, and read these versions of the
data. This avoids managing locks for read transactions because writes can
be isolated by
virtue of the old versions being maintained, rather than through a process
of locks or mutexes.
Writes affect a future version but at the
transaction ID that the read is working at, everything is guaranteed to be
consistent because the writes are occurring at a later transaction
ID.

MVCC提供时间一致性读。MVCC下的读事务一般用一个时间戳或者事务ID来决定读取什么样的数据状态,和哪个版本的数据。这避免了为读事务加锁,因为写操作被独立执行在老本本的数据上,而不是通过发起锁或者互斥进程。写影响一个将来版本的数据,而不是读操作正在进行的事务id版。任何数据都一致的,因为写影响下一个事务id。

翻译:多版本并发控制,布布扣,bubuko.com

时间: 2024-08-25 03:00:41

翻译:多版本并发控制的相关文章

mysql的mvcc(多版本并发控制)

mysql的mvcc(多版本并发控制) 我们知道,mysql的innodb采用的是行锁,而且采用了多版本并发控制来提高读操作的性能. 什么是多版本并发控制呢 ?其实就是在每一行记录的后面增加两个隐藏列,记录创建版本号和删除版本号, 而每一个事务在启动的时候,都有一个唯一的递增的版本号. 1.在插入操作时 : 记录的创建版本号就是事务版本号. 比如我插入一条记录, 事务id 假设是1 ,那么记录如下:也就是说,创建版本号就是事务版本号. id name create version delete

InnoDB的多版本并发控制(MMVC)

InnoDB的MVCC之(乐观锁),是通过在每行记录保存两个隐藏列来实现的.这两个列,一个是存创建时间,一个是删除时间,这里的时间指的是,系统版本号,并不是真正的时间值. 每开始一个新的事务,系统版本号都会自动递增.事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录版本号比较. 下面看一个在REPEATABLE READ(可重复读)隔离级别下,MVCC的具体操作: SELECT InnoDB会根据以下两个条件检查每行记录: 1.InnoDB只查找版本小于或等于当前事务版本的数据行

SQL事务的四种隔离级别和MySQL多版本并发控制

SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的那些改变时可见的,那些是不可见的.低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销. ReadUncommitted(读取未提交内容) 在该隔离级别,所有事务都可以看到其他未提交事务的执行结构.本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少.读取未提交的数据,也被称之为脏读(Dirty Read) ReadCommitted(读取提交内容) 这是大多数数据库系统的默认隔离级别(但不是MySQL默认的).它

多版本并发控制(MVCC)在分布式系统中的应用

问题 最近项目中遇到了一个分布式系统的并发控制问题.该问题可以抽象为:某分布式系统由一个数据中心D和若干业务处理中心L1,L2 ... Ln组成:D本质上是一个key-value存储,它对外提供基于HTTP协议的CRUD操作接口.L的业务逻辑可以抽象为下面3个步骤: read: 根据keySet {k1, ... kn}从D获取keyValueSet {k1:v1, ... kn:vn} do: 根据keyValueSet进行业务处理,得到需要更新的数据集keyValueSet' {k1':v1

MySQL MVCC(多版本并发控制)

概述 为了提高并发MySQL加入了多版本并发控制,它把旧版本记录保存在了共享表空间,在事务未提交之前对应的行记录还是受到锁的限制,当事务提交之后对应的记录行就在缓存中被修改了记录也被持久化了,当刷新线程按一定的规律进行刷新的时候行的修改记录被刷新到了物理数据页中,并且共享表空间的中的旧版本记录页也被清除. 正文 多版本并发控制只针对innodb的repeatable read和read committed这两种隔离级别.多版本并发控制的原理就是在每个记录行后面增加两个标示列用来存储该行的状态,分

Mysql 的InnoDB事务方面的 多版本并发控制如何实现 MVCC

MVCC:Multi-Version Concurrency Control 多版本并发控制.笔者用自己的话对MVCC做一个总结:通过某个时间点上的数据快照对数据的版本控制,目的是为了避免使用各种锁影响并发性能 ●MySQL锁机制 说到锁,MySQL里提供了几种锁机制 读写锁 表锁 (MYISAM使用了表锁)行级锁 (InnoDB使用了行级锁) 第一点: MVCC并不是MySql独有的,Oracle,PostgreSQL等都在使用. MVCC并没有简单地使用行锁,而是使用“行级别锁”(row-l

《高性能MySQL》读书笔记之 MySQL锁、事务、多版本并发控制的基础知识

1.2 并发控制 1.2.1 读写锁 在处理并发读或写时,通过实现一个由两种类型的锁组成的锁系统来解决问题.这两种类型的锁通常被称为 共享锁(shared lock) 和 排它锁(exclusive lock),也叫读锁(read lock)和写锁(write lock). 读锁是共享的,或者说是不互相阻塞的.多个客户端可以在同一时刻读取同一个资源,而互不干扰.写锁则是排他的,也就是说一个写锁会阻塞其他写锁和读锁. 1.2.2 锁粒度 为了提高共享资源的并发性,尽量只锁定需要修改的部分数据,而不

1.4 多版本并发控制

多版本并发控制(Multi-Version Concurrency Control, MVCC)是 MySQL 的 InnoDB 存储引擎实现隔离级别的一种具体方式,用于实现提交读和可重复读这两种隔离级别.而未提交读隔离级别总是读取最新的数据行,无需使用 MVCC.可串行化隔离级别需要对所有读取的行都加锁,单纯使用 MVCC 无法实现. MVCC的实现,是通过保存数据在某个时间点的快照来实现的.也就是说,不管需要执行多长时间,每个事物看到的数据都是一致的. 版本号: 系统版本号:是一个递增的数字

MySQL-InnoDB-MVCC多版本并发控制

一.MySQL可重复读级别下,因为MVCC引起的BUG,下图1为相应的Java代码,其中事务1的生命周期最长,循环开启的事务2.3.4...与事务1存在并发问题 图1 解决方案:将方法userRemoteService.addUser和UserBaseContext.getUserBaseByUserId放在两个方法中,避免事务的并发问题 二.MVCC简介:Multiversion Concurrency Control,多版本并发控制机制,行级锁的一个变种, 但是它在很多情况下避免了加锁操作,