Multi-Version Concurrency Control 多版本并发控制,MVCC 是一种并发控制的方法,
一般在数据库管理系统中,实现对数据库的并发访问;在编程语言中实现事务内存。
实现原理
放在中间件的用户进程通过tcp/ip连接到服务器上 服务器给Oracle用户进程派生一个server的服务器进程
用户进程和服务器进程 两者建立连接(connect) 再通过身份验证之后 建立会话(session)
server进程访问数据 实际上是访问数据库缓存区的某个数据块
该数据块记录了某一条数据 比如某个员工的工资记录 4300
现在 用户进程中提交了一条sql语句(update) 将该员工的工资做出调整 变为5000
Oracle会将原数据4300拷贝至回滚段中保存 server进程将 原数据块中的数据 调整为5000
如果事务未提交 则其他用户 看不到修改
这时 另一个用户对工资信息 有需求进行查询 建立新的用户进程 服务进程连接到数据库缓存区中
这时候就会产生一个认知误区 认为Oracle读取的是回滚段中的4300数据 但实际上
Oracle将5000数据块复制到一个空的buffer 进行操作–>使用回滚段将数据 恢复为4300
这时我们再数据库缓存区中一共拥有三个数据对象 分别是
第一个用户修改过后的数据块 数值为5000
原数据块的回滚段 数值为4300
第二个用户访问的 原数据块的copy 并使用undo段进行恢复 数值为4300
对于 两个用户 其实连接的是同一个数据块 具有相同的DBA (数据块地址)
用户1所连接的数据块 被称之为当前版本 (current)
用户2所连接的数据块 被称之为过去版本 也被称之为CR block(一致性读 consistent read)
这样使得 更新 不会阻塞查询 反之亦然
以上就是关系型数据库中的多版本并发控制 被称之为mvcc
想要查询更旧的数据 取决于undo中是否存在更旧的数据 也被称之为闪回查询
如图所示