前言
提示:mvcc使用快照的方式存储各种版本的数据。
读已提交事务隔离级别读取的是被锁定行的数据的最新的快照。可重复读隔离级别读取的总是本事务开始时的行数据版本。作用:解决不同事务之间对于行数据的读写的并发性能问题。实现: 通过undo log来实现。
一、版本号
每行记录都多创建了两个字段,一个是创建时的版本号(假设字段为M),一个是删除时对应的版本号(假设字段为N)
二、使用
以可重复读来说明下:
select时: 查找时,只查行数据的M字段版本号小于等于当前版本号的,小于说明是本事务开始前已经存在的数据,等于则说明该行数据是本事务中创建的。
N字段要么未定义,即没有删除,或者是版本号大于当前事务,则说明,要删除也是在该事务结束后才删除的。
插入和删除: 标记行数据的M和N字段即可
update: 先建一条数据,再删除原数据,标记对应的M和N字段即可
读已提交类似。
三、可重复读和幻读的处理
通常有两种方案:
悲观锁,即使用mysql的锁来实现。
乐观锁,即通过版本控制。
悲观锁:
正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制(也只有数据库层提供的锁机制才能真正保证数据访问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会修改数据)。在悲观锁的情况下,为了保证事务的隔离性,就需要一致性锁定读。读取数据时给加锁,其它事务无法修改这些数据。修改删除数据时也要加锁,其它事务无法读取这些数据。
乐观锁:
InnoDB的MVCC就是通过这种方式实现的。
相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销,特别是对长事务而言,这样的开销往往无法承受。
而乐观锁机制在一定程度上解决了这个问题。乐观锁,大多是基于数据版本( Version )记录机制实现。何谓数据版本?即为数据增加一个版本标识,在基于数据库表的版本解决方案中,一般是通过为数据库表增加一个 “version” 字段来实现。读取出数据时,将此版本号一同读出,之后更新时,对此版本号加一。此时,将提交数据的版本数据与数据库表对应记录的当前版本信息进行比对,如果提交的数据版本号大于数据库表当前版本号,则予以更新,否则认为是过期数据。
总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。