前提

  • 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(前面写有文章介绍过

  • 主要是要加锁就一直加,释放锁就只能一路释放操作。(不允许加的过程有释放或者释放过程有加锁的)
本站提供的所有下载资源均来自互联网,仅提供学习交流使用,版权归原作者所有。如需商业使用,请联系原作者获得授权。 如您发现有涉嫌侵权的内容,请联系我们 邮箱:[email protected]