专栏首页技术进阶之路使用封锁协议解决事务的并发问题

使用封锁协议解决事务的并发问题

一、事务的并发问题


事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。

并发是指多个事务同时执行,这会带来一些问题。

丢失修改

丢失修改由两次事务的修改导致,比如事务 T1 修改 A,同时事务 T2 也修改 A,那么最后 A 的值将由事务 T2 的修改结果决定,这样事务 T1 的修改就没了,导致丢失修改。

不可重复读

分为两种情况,第一种是事务 T1 读取 K ,这个时候读取到一个值 A,然后事务 T2 增加或者删除了一条记录,过了一会事务 T1 又过来读取了这个 A ,发现值不见了,或者多了一些值,很迷幻,所以叫幻读。

第二种情况就是前面相同,但是事务 T2 修改了刚才读取的那个值 A ,导致事务 T1 再过来读的时候发现值不一样了,这叫做不可重复读。

脏读

事务 T1 修改了 A 的值,但是还没有提交,这个时候被事务 T2 读取了 A 的值,但是过了一会事务 T1 由于某些原因回滚了操作,所以 T2 读取到的值就是错的,这就是 脏读

二、封锁协议


两类锁

两类锁分别是 排它锁 X共享锁 S

T 给数据 A 加上排它锁之后,就只有 T 才能读和修改 A,同时其他事务就不能再加任何锁了,直到 T 释放排它锁。

T 给数据 A 加上共享锁之后,T 只能读 A,不能修改,其他事务可以在它的基础上加共享锁,但是不能加排它锁,也就是说其他的事务只能读不能修改,直到 T 释放共享锁为止。

封锁协议

封锁协议规定了使用锁对数据对象加锁时需要遵循的规则。

一级封锁协议

它规定事务在修改数据之前必须加排它锁,直到事务结束才释放。

这就解决了丢失修改的问题,因为事务在修改数据的时候要加 X 锁,之后其它事务就不能再加锁了,也就是不能修改了,必须等第一个事务修改完成之后才能再加锁然后修改。

但是读数据的时候是不用加锁的,那就解决不了其它的问题。

二级封锁协议

它规定事务在读取事务之前必须加共享锁,而 读取结束就释放

注意这里是读完了就可以释放锁了,还是不太行,但是可以解决脏读的问题:比如事务 T1 在修改数据的时候加了 X 锁,这个时候事务 T2 要想再读取就要加 S 锁,但是在 X 锁释放之前是不能加其他锁的,所以必须等待事务 T1 释放锁,这个时候无论他是提交事务还是回滚都不会影响到 T2 读取的数据正确性了。

但是他不能不解决可重复读的问题。

三级封锁协议

它规定事务在读取事务之前必须加共享锁,直到 事务结束 才释放。

这就解决了不可重复度的问题,因为当事务 T1 读取数据对象的时候,加了 S 锁,其他的事务想修改该数据对象,必须加 X 锁,但是在 S 锁之上是不能加 X 锁的,只能等到 T1 释放 S 锁,而释放的时候事务 T1 也结束了。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Design Patterns 之命令模式

    在许多设计中,经常会出现一个对象直接请求另一个对象调用其方法以达到某种目的的行为,这里的两个类之间就会出现紧耦合。这很不好,所以我们应该将 方法的请求者 和 方...

    wsuo
  • 事务并发调度的可串行性及两段锁协议

    就是当很多事务同时执行的时候应该按照什么顺序执行,应该按照排队的顺序执行,这就是 串行调度 。

    wsuo
  • 设计模式之 —— 状态模式 State

    在软件开发过程中,应用程序中的部分对象可能会根据不同的情况做出不同的行为,我们把这种对象称为 有状态的对象 ,而把影响对象行为的一个或多个动态变化的属性称为状态...

    wsuo
  • 招式修炼-redis事务和发布订阅

    这个命令唯一做的就是, 将客户端的 REDIS_MULTI 选项打开, 让客户端从非事务状态切换到事务状态。

    Share猿
  • 很好理解的分布式事务

    事务是保证一系列操作是一个整体,要么都执行,要么都不执行。比如A给B转账,A扣钱了,B的账户的钱也要加上去,不能出现A扣钱B不加钱,或者B加钱A不扣钱的情况。在...

    逝兮诚
  • 分布式事务选型及对比

    如果您也对Java感兴趣,我的文章能帮助到您,加入【Go Big】一起进步。群号:243108249

    envoke
  • 基于 Node.js 的 Serverless 架构实践

    通过将 BFF 构建于 serverless 之上,将人工智能实验室(天猫精灵)数十个中后台应用整合到了一个统一入口。用云函数的方式取代了传统基于 NodeJS...

    五月君
  • Comparable和Comparator兄弟情深?

    Comparable和Comparator乍一看像兄弟俩。但是,虽然长得像,使用上却是有很多区别。

    烟雨星空
  • 一文讲透微服务下如何保证事务的一致性

    什么是事务?回答这个问题之前,我们先来看一个经典的场景:支付宝等交易平台的转账。假设小明需要用支付宝给小红转账 100000 元,此时,小明帐号会少 10000...

    用户2781897
  • AI新闻报简单自学机器学习理论——正则化和偏置方差的权衡

    在第一部分探讨了统计模型潜在的机器学习问题,并用它公式化获得最小泛化误差这一问题;在第二部分通过建立关于难懂的泛化误差的理论去得到实际能够估计得到的经验误差,最...

    企鹅号小编

扫码关注云+社区

领取腾讯云代金券