2PL+MVCC看一些场景

前提

  • 1.我们通过一个简单的2PL控制事务。
  • 2.数据是保存在B+树里面有版本号。
  • 3.事务提交、回滚我们是会把数据的状态改一下。

为什么会有以下问题

  • 1.主要是因为当前的demo查询是通过主键和版本来的,可能会查到之前其他事务的数据。
  • 2.查询操作我是这样来的:查询数据A,我们查的是最新提交的数据(因为最新提交了所以当前事务是没触发这里的锁),或者是中间状态但是事务是但是是当前版本的(当前事务对数据做了多次操作,但没提交)。
  • 3.我这里的2PL锁控制不知道算严格不?

如果当前只是一个查询事务做了提交

  • 1.当我们申请锁的时候区分下读锁和写锁,如果有写锁才被允许提交的。所以如果全部是读锁的话事务提交对数据是不做任何处理的。

如果当前事务A提交的间隙有个事务B操作了数据

  • 1.假如事务A有锁lock-1,lock-2,B会操作lock2的数据
  • 2.A对lock-1操作完,去拿lock-2的锁,如果拿到的话B会在A操作完且释放后才会拿到,所以这个场景是不受影响的,即A先操作数据、B在操作数据。
  • 3.A对lock-1操作完,去拿lock-2的锁,如果没拿到但是B拿到了这时候B操作完数据,A再拿到lock-2的锁操作数据,这个场景就是B先操作数据、A再操作数据。

如果当前事务回滚了

  • 1.没有写操作回滚不用管了
  • 2.有写操作的话,锁是互斥的,你已经拿到了锁(意味着当前事务操作的数据是最新的)回滚的也是当前的事务的数据。

还有一些设计问题还没想好

  • 访问的权限类的限制,我现在搞了个demo可以直接传事务号过去(目前做的一个限制是存活的事务号才可以操作数据)

最后再说下2PL(前面写有文章介绍过

  • 主要是要加锁就一直加,释放锁就只能一路释放操作。(不允许加的过程有释放或者释放过程有加锁的)
相关推荐
用户77283104908406 小时前
krono-job:零侵入、单二进制交付的分布式任务调度平台(开源)
后端
Conan在掘金7 小时前
鸿蒙报错速查:Function lacks ending return statement,返回路径漏 return 就炸,根因 + 真解法
后端
X-⃢_⃢-X7 小时前
十、Redis之布隆过滤器
数据库·redis·缓存
Nturmoils7 小时前
订单号查出了三笔,我以为是数据脏了,其实是自己写错了
数据库
ZKNOW甄知科技7 小时前
燕千云深度集成飞书:以AI之力,开启无感IT运维体验
大数据·运维·网络·数据库·人工智能·低代码·集成学习
TDengine (老段)7 小时前
TDengine 免费版说明
java·大数据·数据库·物联网·时序数据库·tdengine
汉知宝科技7 小时前
历史案件数据迁移:知识产权管理系统落地的第一道门槛
大数据·数据库
人间凡尔赛7 小时前
AI-Native 云原生架构:2026 年从容器编排到智能体编排的范式革命
后端·云原生·架构
这就是佬们吗7 小时前
Python入门⑤-异常处理、文件操作与实战项目
开发语言·数据库·python·算法·pycharm
吴声子夜歌7 小时前
MongoDB 4.x——SpringBoot框架整合
数据库·spring boot·mongodb