技术实践丨列存表并发更新时的锁等待问题原理「建议收藏」

技术实践丨列存表并发更新时的锁等待问题原理「建议收藏」摘要:当开启transaction,执行updata的语句执行成功,不执行commit或rollback;再开启另一个窗口,执行upadate语句,会出现失败(报错:锁等待超时)的情况,但是如果对于…

技术实践丨列存表并发更新时的锁等待问题原理

摘要:当开启transaction,执行updata的语句执行成功,不执行commit或rollback;再开启另一个窗口,执行upadate语句,会出现失败(报错:锁等待超时)的情况,但是如果对于上一个窗口执行rollback,此窗口update可以执行成功,该种情况应考虑该表是否为列存表。

本文分享自华为云社区《列存表并发更新时时的锁等待问题原理》,原文作者:PFloyd 。

当开启transaction,执行updata的语句执行成功,不执行commit或rollback;再开启另一个窗口,执行upadate语句,会出现失败(报错:锁等待超时)的情况,但是如果对于上一个窗口执行rollback,此窗口update可以执行成功,该种情况应考虑该表是否为列存表。

【问题根因】

如果使用的是列存表,在事务中执行update操作时,是以CU为单位进行加锁的,所以在事务未提交时并发更新同一CU的其他数据时会出现锁等待的情况,等待超时的时候会出现报错

【机制原理】

1.CU为压缩单元(Compress Unit),列存储的最小单位,导入数据时生成,生成后数据固定不可更改,单个CU最多存储1列60000行数据。同一列的CU连续存储在一个文件中,当大于1G时,切换到新文件中。其中的Ctid字段标识列存表的一行,由cu_id和CU内行号(cu_id, offset)组成;一次性写入的多条的数据位于同一CU。

2. 为了防止页面同一个元组被两个事务同时更新,在进行update时,都会加上行级锁,对于行存来说是对一行数据加锁,对于列存来说就是对一个CU加锁,当一个事务update未提交时,其他事务是无法同时去更新同一CU的数据的。

3.进行update操作后,旧元组被标记为deleted,新元组会写到一个新的CU中

【案例分析】

1.根据现场的报错信息,可以确定是并发更新报错;进行update时,会申请行级锁,在申请行级锁之前会申请transactionid锁,等待超时后报错信息为:waiting for ShareLock on transaction xxx after ..ms

2. 客户反应更新的并不是同一条数据,id不同,询问客户后得知出现问题的是列存表,查询更新的数据是否处于同一CU。

技术实践丨列存表并发更新时的锁等待问题原理「建议收藏」

查询后发现处于同一CU,符合预期。

3. 本地场景复现:

起事务执行update操作:

技术实践丨列存表并发更新时的锁等待问题原理「建议收藏」

事务未提交并发更新数据出现等待:

技术实践丨列存表并发更新时的锁等待问题原理「建议收藏」

查询后发现两条数据位于同一cu:

技术实践丨列存表并发更新时的锁等待问题原理「建议收藏」

【相关问题】

为什么update成功一次之后,下一次update就不会互相等锁了?

这是因为update成功之后,旧数据被标记为deleted,新数据写入新的CU,这两条数据不再是同一个CU了,也就不存在这种锁冲突

【处理方案】

列存表不适合频繁的update场景,列存频繁的update容易触发并发更新等锁超时,并且会导致小CU过多,而每个CU都会扩展至8192字节进行对齐,从而导致磁盘空间迅速膨胀;频繁的点查或频繁update场景建议使用行存表。

 

点击关注,第一时间了解华为云新鲜技术~

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/6285.html

(0)
上一篇 2023-04-13
下一篇 2023-04-13

相关推荐

  • linux上部署mysql(记录)

    linux上部署mysql(记录)默认linux未安装过mysql,若已安装,则自行解决卸载问题。 传送门:https://www.jianshu.com/p/276d59cbc529 将 mysql-5.7.22-linux-gl…

    2023-02-18
    104
  • 杭州联合银行 x 袋鼠云:打造智能标签体系,助力银行大零售业务转型「终于解决」

    杭州联合银行 x 袋鼠云:打造智能标签体系,助力银行大零售业务转型「终于解决」“智能标签平台上线后,支行及业务部门已创建多个客群用于营销,为我行客户精细化管理打下了良好基础。” 杭州联合银行始终以服务市民、小微企业、经济组织和地方经济发展为己任,本着“做小、做散、做深”的原则,

    2023-06-20
    96
  • 【赵强老师】MySQL高可用架构:MHA

    【赵强老师】MySQL高可用架构:MHAMHA(Master HA)是一款开源的 MySQL 的高可用程序,它为 MySQL 主从复制架构提供了 automating master failover 功能。MHA 在监控到 master 节

    2023-03-25
    106
  • 分布式 | Global 表 Left Join 拆分表实现原因探究「建议收藏」

    分布式 | Global 表 Left Join 拆分表实现原因探究「建议收藏」作者:郭奥门 爱可生 DBLE 研发成员,负责分布式数据库中间件的新功能开发,回答社区/客户/内部提出的一般性问题。 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联…

    2023-03-16
    105
  • 解决Python中name ‘os’ is not defined错误

    解决Python中name ‘os’ is not defined错误在Python中,我们可以使用import语句来导入其他的Python模块,通过导入模块来调用其中定义的方法和变量,这也是Python强大的面向对象编程的基础之一。然而,当我们在程序中出现name ‘os’ is not defined错误时,就表示Python找不到名为os的模块或者变量。这种错误通常在导入模块时出现,而且它还说明了一个很重要的问题,就是Python的模块机制。

    2024-03-25
    33
  • sql server on linux 配置过程

    sql server on linux 配置过程最近因为搭建公司的IT系统,之前因为财务已经购买了的财务软件用到的是sqlserver,考虑到小公司,尽量减少额外的花销,所以最后还是决定直接使用sqlserver(本来想提升一下自己能力来使用my…

    2023-03-24
    114
  • 技术分享 | mysql show processlist Time 为负数的思考「建议收藏」

    技术分享 | mysql show processlist Time 为负数的思考「建议收藏」作者:高鹏 文章末尾有他著作的《深入理解 MySQL 主从原理 32 讲》,深入透彻理解 MySQL 主从,GTID 相关技术知识。 一、问题来源 这是一个朋友问我的一个问题,问题如下,在 MTS …

    2022-12-24
    91
  • 使用Scrapy爬取JavaScript动态页面的方法

    使用Scrapy爬取JavaScript动态页面的方法在网络爬虫的世界中,有很多网站使用JavaScript技术呈现动态页面,这就给爬虫的编写带来了一定的挑战。在这篇文章中,我们将介绍使用Scrapy爬取JavaScript动态页面的方法,帮助读者了解如何应对这个难题。

    2024-05-10
    15

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注