mvcc是怎么实现无锁的,网上全都是说读视图,但是就算有读视图,也要先去读取数据行的事务ID,如果这个事务ID可见,那么这个数据行可见,但是其他并发写可能会改变这个数据行啊,读操作还是可能读到一个中间结果,这怎么解决,求佬解惑
全部评论
mvcc解决的是快照读。利用多版本控制执行的。也就是说修改操作并不是直接在原来上面修改。因为要保持老版本。利用undo log日志。
1 回复 分享
发布于 06-10 10:45 广东
可以理解简单,一个修改操作提交会放入到链头,而且在他之前的快照读事务,读取到的链中的数据。
点赞 回复 分享
发布于 06-10 10:48 广东
我怎么感觉没懂通你这个描述呢
点赞 回复 分享
发布于 06-10 10:51 山东
只要保证rollptr和tra index原子修改即可 正在修改的数据当前读是看不到的
点赞 回复 分享
发布于 06-13 12:08 广东
mvcc不是无锁的,只是一种思想,读写互不阻塞,实现分mvocc,mv2pl等,想要具体了解去看论文
点赞 回复 分享
发布于 07-10 20:11 北京
会不会我在写的时候先申请一片内存写入新数据,最后把新数据的回滚指针指向老数据
点赞 回复 分享
发布于 07-30 19:18 浙江
mvcc实现读不阻塞写,写不阻塞读,写依然阻塞写,读阻塞读。
点赞 回复 分享
发布于 08-03 09:56 天津
mvcc这里指的是数据库的上层,不会像当前读那样锁住表的一行。数据库具体的底层实现跟这些关系不大,可能用的是cas也可能用的是mutex。具体实现估计要看源码。
点赞 回复 分享
发布于 08-04 16:39 北京

相关推荐

#百度##Java 实习##日常##面试##日常实习面试#时长50分钟,感觉有点难,面完汗流浃背了。1. 看到你的项目用到了mybatis,mybatis如何避免sql注入的2. mybatis避免sql注入的原理是什么?3. mybatis怎么实现动态sql判断?4. 看到你项目用到了springboot,springboot的全局异常处理是怎么做的?5. 如果是自定义异常你又该如何进行全局处理?6. 如果服务的qps远大于了接口能消费的qps,你该怎么办?7. 如果发生了内存溢出,你该怎么去排查?8. linux命令,如何统计一个文件夹下所有的Java文件9. 手撕1:写一个单例模式 如何保证线程安全问题10. 因为我写的饿汉式,于是又问了,这样是不是不满足懒加载,说一下springboot懒加载11. (到刚才那个题的时候我已经麻了)手撕2:LRU 口述12. 说一下LRU应该用Java的什么数据结构?(我选的LinkedList)13. 你这个程序如何保证链表的长度14. 如何保证你在修改链表的时候是线程安全的15. (我说的用synchronized包裹)面试官说,你这样是不是包裹的范围太大了?性能有影响,有没有更好的方法?(我已经麻了,不知道说啥了,说了个CAS)16. 手撕3:实现一个消息中心 口述17. 这个消息中心如果要保证一分钟之内最多只能发M条消息该怎么做18. 怎么保证这个消息中心的可扩展性,可以后续接入信息、短信、IM等19. 怎么保证这个消息中心的线程安全,同时保持尽量高的性能20. 看你项目用到了工厂模式,说一下什么是静态工厂什么是抽象工厂21. 说一下接口和抽象类的区别22. 缓存三兄弟及其解决方案真的不知道是我太菜了,还是这次面试真的很难,我真的从第一题就开始有点懵,第一次见到问mybatis的。看来还得沉淀-------------------------------------------------------------------------------------------------------------------面完1小时后,oc 已拒。
百度开奖80人在聊 查看22道真题和解析
点赞 评论 收藏
分享
1.略2.有n棵树要修剪 每棵树原高度Hi应该修剪到(pi,qi),你一次可以修剪区间(i,j)-1高度,求最少修剪次数(卡 LL    int t;    cin >> t;    while (t--)    {        int n;        cin >> n;        vector>arr(n, vector(3));        for (int i = 0; i < arr.size(); i++)        {            cin >> arr[i][0] >> arr[i][1] >> arr[i][2];        }        vector>p(arr.size());        for (int i = 0; i < arr.size(); i++)        {            p[i].first = arr[i][2] - arr[i][1];            p[i].second = arr[i][2] - arr[i][0];        }        long long ans = 0;        int cutp = 0;        cutp = p[0].first;        ans += p[0].first;        for (int i = 0; i < arr.size()-1; i++)        {            if (p[i + 1].first>cutp) {                ans += p[i + 1].first-cutp;                cutp = p[i + 1].first;            }            if (p[i + 1].second < cutp)            {                cutp = p[i + 1].second;            }        }        cout << ans << endl;    },3.异位字符串哈希表秒了
查看1道真题和解析 投递美的集团等公司10个岗位
点赞 评论 收藏
分享
2 18 评论
分享
牛客网
牛客企业服务