乐观锁和 MVCC 的区别
来源:互联网 发布:下载哔哩哔哩视频软件 编辑:程序博客网 时间:2024/05/22 06:34
作者:用心阁
链接:https://www.zhihu.com/question/27876575/answer/71836010
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
在数据库中,并发控制是指在多个用户/进程/线程同时对数据库进行操作时,如何保证事务的一致性和隔离性的,同时最大程度地并发。当多个用户/进程/线程同时对数据库进行操作时,会出现3种冲突情形:读-读,不存在任何问题读-写,有隔离性问题,可能遇到脏读(会读到未提交的数据) ,幻影读等。写-写,可能丢失更新要解决冲突,一种办法是是锁,即基于锁的并发控制,比如2PL,这种方式开销比较高,而且无法避免死锁。多版本并发控制(MVCC)是一种用来解决读-写冲突的无锁并发控制,也就是为事务分配单向增长的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,读操作只读该事务开始前的数据库的快照。 这样在读操作不用阻塞写操作,写操作不用阻塞读操作的同时,避免了脏读和不可重复读乐观并发控制(OCC)是一种用来解决写-写冲突的无锁并发控制,认为事务间争用没有那么多,所以先进行修改,在提交事务前,检查一下事务开始后,有没有新提交改变,如果没有就提交,如果有就放弃并重试。乐观并发控制类似自选锁。乐观并发控制适用于低数据争用,写冲突比较少的环境。多版本并发控制可以结合基于锁的并发控制来解决写-写冲突,即MVCC+2PL,也可以结合乐观并发控制来解决写-写冲突。
作者:吴镝
链接:https://www.zhihu.com/question/27876575/answer/73330077
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
MVCC解决的问题是读写互相不阻塞的问题,每次更新都产生一个新的版本,读的话可以读历史版本。试想,如果一个数据只有一个版本,那么多个事务对这个数据进行读写是不是需要读写锁来保护? 一个读写事务在运行的过程中在访问数据之前先加读/写锁这种实现叫做悲观锁,悲观体现在,先加锁,独占数据,防止别人加锁。乐观锁呢,读写事务,在真正的提交之前,不加读/写锁,而是先看一下数据的版本/时间戳,等到真正提交的时候再看一下版本/时间戳,如果两次相同,说明别人期间没有对数据进行过修改,那么就可以放心提交。乐观体现在,访问数据时不提前加锁。在资源冲突不激烈的场合,用乐观锁性能较好。如果资源冲突严重,乐观锁的实现会导致事务提交的时候经常看到别人在他之前已经修改了数据,然后要进行回滚或者重试,还不如一上来就加锁。
- 乐观锁和 MVCC 的区别
- 【数据库】MVCC 和 乐观锁
- 乐观锁和悲观锁的区别
- 乐观锁和悲观锁的区别
- 乐观锁和悲观锁的区别
- 乐观锁和悲观锁的区别
- 乐观锁和悲观锁的区别
- 乐观锁和悲观锁的区别
- 乐观锁和悲观锁的区别
- 乐观锁和悲观锁的区别
- 乐观锁和悲观锁的区别
- 乐观锁和悲观锁的区别
- 乐观锁和悲观锁的区别
- 悲观锁和乐观锁的区别
- 乐观锁和悲观锁的区别
- 乐观锁和悲观锁的区别
- 悲观锁和乐观锁的区别
- 乐观锁和悲观锁的区别
- Ubuntu 创建androidstudio快捷图标到桌面
- Android自定义控件之自定义下载progress
- android与js+HTML交互
- 做好软件测试你还需要知道这些
- JavaScript有这几种测试分类
- 乐观锁和 MVCC 的区别
- 【脚本语言系列】关于Python结构化文本文件处理MsgPack,你需要知道的事
- 修改Oracle11g密码有效期的期限
- 笔记2017-06-26
- java foreach的原理
- 分支现场保留
- 手机发烫是为何 --App电量测试定位方法
- Maven私服搭建笔记
- Win10+vs2015+opencv3.20开发环境配置