首页 文章 精选 留言 我的

精选列表

搜索[渲染问题],共10000篇文章
优秀的个人博客,低调大师

遇到 MySQL 死锁问题如何解决?

终于来到死锁检查线程的第三步,可以解决死锁了。 > 作者:操盛春,爱可生技术专家,公众号『一树一溪』作者,专注于研究 MySQL 和 OceanBase 源码。 > >爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 > 本文基于 MySQL 8.0.32 源码,存储引擎为 InnoDB。 1. 选择死锁受害事务 前面介绍了死锁线程做的准备工作,以及发现死锁的过程。现在,是时候解决死锁了。 解决死锁最重要的事情,就是决定回滚死锁环中哪个事务,也就是选择哪个事务作为死锁受害事务。 选择死锁受害事务之前,还要做一件比较重要的小事,就是按照死锁环中各事务进入锁等待状态的时间从先到后进行排序。排序之后的事务,会存放到一个数组里,我们称之为死锁数组。 之所以要这么做,是为了根据其它条件无法选出哪个事务作为死锁受害事务的情况下,选择最晚进入锁等待状态的事务作为死锁受害事务。 给死锁环中各事务排序之后,就可以基于死锁数组来选择死锁受害事务了。 这个过程当然又要遍历死锁数组了,同样,每次取死锁数组中的一个事务。 第 1 轮循环有点特殊,直接把取到的事务(死锁数组中第一个事务)作为候选受害事务。 第 2 轮及以后的循环,把取到的事务和上一轮循环选出来的候选受害事务进行比较,决定两者之中谁作为本轮循环的受害事务。 选择谁作为本轮循环的受害事务,这是个艰难的决定,过程如下。 第 1 步,根据两个事务的优先级,决定谁是本轮循环的受害事务。 两个事务中,如果一个是高优先级事务(优先级大于 0),一个是低优先级事务(优先级等于 0),选择低优先级事务作为本轮循环的受害事务。 如果两个事务都是高优先级事务(优先级大于 0),选择优先级更低的事务作为本轮循环的受害事务。 如果两个事务都是低优先级事务(优先级等于 0),进入第 2 步。 第 2 步,根据事务是否改变(插入、更新、删除)了不支持事务的表(例如 MyISAM 表)的数据,决定谁是本轮循环的受害事务。 两个事务中,如果只有一个事务改变了不支持事务的表的数据,选择它作为本轮循环的受害事务。 如果两个事务都没有改变,或者都改变了不支持事务的表的数据,进入第 3 步。 第 3 步,根据事务的回滚成本,决定谁是本轮循环的受害事务。 事务的回滚成本,由两部分相加得到: 事务进入锁等待状态之前,产生的 undo 日志数量。 事务进入锁等待状态之前,加表锁和行锁总共创建了几个锁结构。 如果两个事务回滚成本不同,选择成本低的那个作为本轮循环的受害事务,否则进入第 4 步。 第 4 步,选择本轮循环取到的事务作为受害事务。 来到这一步,说明前三步都无法在两个事务中选出一个作为本轮循环的死锁受害事务。 这两个事务是:本轮循环取到的事务、上一轮循环选出来的受害事务。 因为死锁数组中各事务已经按照进入锁等待状态的时间先后排了序,这一步直接把本轮循环取到的事务作为本轮循环的受害事务,其实隐含了一个逻辑,就是选择两个事务中更晚进入锁等待状态的事务,作为本轮循环的受害事务。 遍历完死锁数组中所有事务之后,最终会选出一个事务作为受害事务。 2. 计算并更新事务权重 前面介绍过,在准备工作阶段,死锁线程提升阻塞事务权重时,死锁环中锁等待事务的权重,不会累加到阻塞事务的权重上,而是要等到确定死锁受害事务之后,再为死锁环中除受害之外的其它事务进行一次提升权重的操作。 现在,是时候了。 提升权重的过程,从被死锁受害事务阻塞的那个事务开始,根据死锁环中各事务的等待关系,逐个把锁等待事务的权重累加阻塞事务的权重上。 上面只介绍了提升权重操作,其实还有一个降低权重操作,就是把死锁受害事务的权重降为 0。 以上提升权重、降低权重操作的结果,都临时存放在权重数组里。 完成以上操作之后,死锁环中所有事务的权重都会更新到对应的事务对象中。 3. 记录死锁日志 如果系统变量 innodb_print_all_deadlocks 的值为 ON,死锁检查线程还会把死锁的详细信息写入 MySQL 的错误日志文件中。 示例 SQL 写入 MySQL 错误日志文件的死锁信息如下: 2024-07-07T13:00:15.602373Z 0 [Note] [MY-012468] [InnoDB] Transactions deadlock detected, dumping detailed information. 2024-07-07T13:00:15.602446Z 0 [Note] [MY-012469] [InnoDB] *** (1) TRANSACTION: TRANSACTION 227599, ACTIVE 21 sec starting index read mysql tables in use 1, locked 1 LOCK WAIT 3 lock struct(s), heap size 1192, 2 row lock(s) MySQL thread id 8, OS thread handle 123145400471552, query id 96 localhost 127.0.0.1 root statistics SELECT i1 FROM t1 WHERE id = 20 FOR UPDATE 2024-07-07T13:00:15.602597Z 0 [Note] [MY-012469] [InnoDB] *** (1) HOLDS THE LOCK(S): RECORD LOCKS space id 0 page no 46 n bits 80 index PRIMARY of table `test`.`t1` trx id 227599 lock_mode X locks rec but not gap Record lock, heap no 2 PHYSICAL RECORD: n_fields 4; compact format; info bits 0 0: len 4; hex 0000000a; asc ;; 1: len 6; hex 000000035958; asc YX;; 2: len 7; hex 82000000a50110; asc ;; 3: len 4; hex 80000065; asc e;; 2024-07-07T13:00:15.603277Z 0 [Note] [MY-012469] [InnoDB] *** (1) WAITING FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 0 page no 46 n bits 80 index PRIMARY of table `test`.`t1` trx id 227599 lock_mode X locks rec but not gap waiting Record lock, heap no 3 PHYSICAL RECORD: n_fields 4; compact format; info bits 0 0: len 4; hex 00000014; asc ;; 1: len 6; hex 000000035958; asc YX;; 2: len 7; hex 82000000a5011d; asc ;; 3: len 4; hex 800000c9; asc ;; 2024-07-07T13:00:15.603950Z 0 [Note] [MY-012469] [InnoDB] *** (2) TRANSACTION: TRANSACTION 227600, ACTIVE 17 sec starting index read mysql tables in use 1, locked 1 LOCK WAIT 3 lock struct(s), heap size 1192, 2 row lock(s) MySQL thread id 11, OS thread handle 123145401536512, query id 97 localhost 127.0.0.1 root statistics SELECT * FROM t1 WHERE id = 10 FOR UPDATE 2024-07-07T13:00:15.604083Z 0 [Note] [MY-012469] [InnoDB] *** (2) HOLDS THE LOCK(S): RECORD LOCKS space id 0 page no 46 n bits 80 index PRIMARY of table `test`.`t1` trx id 227600 lock_mode X locks rec but not gap Record lock, heap no 3 PHYSICAL RECORD: n_fields 4; compact format; info bits 0 0: len 4; hex 00000014; asc ;; 1: len 6; hex 000000035958; asc YX;; 2: len 7; hex 82000000a5011d; asc ;; 3: len 4; hex 800000c9; asc ;; 2024-07-07T13:00:15.604741Z 0 [Note] [MY-012469] [InnoDB] *** (2) WAITING FOR THIS LOCK TO BE GRANTED: RECORD LOCKS space id 0 page no 46 n bits 80 index PRIMARY of table `test`.`t1` trx id 227600 lock_mode X locks rec but not gap waiting Record lock, heap no 2 PHYSICAL RECORD: n_fields 4; compact format; info bits 0 0: len 4; hex 0000000a; asc ;; 1: len 6; hex 000000035958; asc YX;; 2: len 7; hex 82000000a50110; asc ;; 3: len 4; hex 80000065; asc e;; 2024-07-07T13:00:15.605401Z 0 [Note] [MY-012469] [InnoDB] *** WE ROLL BACK TRANSACTION (2) > 前面带日期和时间的日志,只有系统变量 log_error_verbosity 的值为 3,才会记录到 MySQL 错误日志文件中。 4. 唤醒死锁受害事务 死锁环中,选择出来的受害事务,会回滚。回滚操作并不是由死锁检查线程完成,而是由事务自己完成。 要想让受害事务自己回滚,它得知道自己被选择成为死锁受害事务了,这个操作由死锁检查线程完成。 死锁检查线程会给死锁受害事务打个标志,让它在被唤醒之后,知道自己被选择成为死锁受害事务了。 死锁受害事务进入锁等待状态之前,创建了一个锁结构,这个锁结构的 type_mode 属性的第 9 位被设置为 1 了,表示这个锁结构处于锁等待状态。 现在,这个锁结构需要从事务对象的 trx_locks 链表中删除。 如果这个锁结构对应的是行锁,还需要从 rec_hash 的数组中对应的行锁结构链表中删除。 如果这个锁结构对应的是表锁,还需要从表对象的 locks 链表中删除。 然后,死锁检查线程会触发死锁受害事务的等待事件,唤醒死锁受害事务。这个等待事件,保存在死锁受害事务占用的那个 slot 对应的 srv_slot_t 对象的 event 属性中。 到这里,死锁检查线程检查并解决死锁的过程就结束了。 剩下工作,就由死锁受害事务自己完成了。 死锁受害事务要完成什么工作? 当然是回滚了。 5. 总结 死锁检查线程解决死锁的过程如下: 把死锁环中各事务按照进入锁等待状态的先后顺序排好序,放到死锁数组中。 遍历死锁数组,每轮循环取一个事务。 第 1 轮循环取死锁数组中第 1 个事务作为候选死锁受害事务。 第 2 轮及以后的循环,根据事务的优先级、是否改变了不支持事务的表的数据、事务的回滚成本,从本轮循环取到的事务,和上一轮循环选出来的死锁受害事务两者中选择一个,作为本轮循环的受害事务。 最后一轮循环选出来的受害事务,就是最终的死锁受害事务,这个事务会回滚。 选出死锁受害事务之后,死锁检查线程还会根据系统变量 innodb_print_all_deadlocks 的值,决定是否记录死锁日志。 然后,会给死锁受害事务打个标记,再唤醒死锁受害事务。 更多技术文章,请访问:https://opensource.actionsky.com/ 关于 SQLE SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。 ✨ Github:https://github.com/actiontech/sqle 📚 文档:https://actiontech.github.io/sqle-docs/ 💻 官网:https://opensource.actionsky.com/sqle/ 👥 微信群:请添加小助手加入 ActionOpenSource 🔗 商业支持:https://www.actionsky.com/sqle

优秀的个人博客,低调大师

Stable Diffusion 因版权问题被起诉

日前,三位艺术家对 Stability AI(Stable Diffusion 背后的开发商)提起了诉讼,指控 Stability AI 直接、间接侵犯版权、违反 DMCA 和不正当竞争等。 这三位艺术家(Sarah Andersen、Kelly McKernan、Karla Ortiz)认为 Stability AI 在「未经原艺术家同意」的情况下,从网络上收集了数十亿张图片用于进行 AI 工具训练,侵犯了包括他们在内的数百万艺术家的权利。 三位艺术家通过专门处理反垄断和集体诉讼案件的 Joseph Saveri 律师事务所与律师 Matthew Butterick 发起了诉讼。其中 Butterick 和 Joseph Saveri 目前也正在起诉微软、GitHub 和 OpenAI,该案涉及 AI 编程模型 CoPilot,起诉的理由与本案类似,只不过一个涉及艺术品生成,另一个涉及代码生成。 律师 Butterick 将此案描述为「朝着使人工智能对每个人都公平和道德的方向迈出的又一步」。他认为像 "Stable Diffusion" 这样的人工智能艺术工具能够用无限数量的侵权图像充斥市场,这会对艺术和艺术家造成永久性伤害。 如果你仔细查看他们的诉讼,你会发现他们对 AI 技术的描述并不准确。该诉讼声称,AI 艺术模型存储受版权保护的训练图像的压缩副本,然后重新组合它们。然而 AI 艺术模型实际上并不存储图像,而是从这些图像中收集模式的数学表征,AI 生成的图像也不是将数据集中的图像东拼西凑组合在一起,而是根据这些数学表征从头开始创建图片。 至于 Stable Diffusion 是否真的侵权就交给法院来审理了,这场诉讼可能会持续多年时间。

优秀的个人博客,低调大师

BCI 常见问题解答

What? SUSE BCI SUSE BCI(Base Container Image)提供了一个基于 SUSE Linux Enterprise Server 的、经过测试和认证的容器镜像仓库,仓库中的容器镜像可以在企业生产环境中使用。 SUSE 的容器镜像和应用程序开发工具是真正开放、灵活和安全的。SUSE 会定期维护这些镜像,使用最新的安全补丁更新镜像,它们的功能与基本操作系统版本一致,开发人员、集成商和操作人员可以随时使用。 用户可以从 SUSE Container Registry 获取 BCI 镜像,并根据 EULA 自行进行复制、使用和分发。 Rancher 2.6 发布后,SUSE 宣布完全集成 Rancher 和 BCI,并且确保符合最新的安全标准。 BCI 包含什么? BCI 包含两组容器镜像: 单纯基于 SLE 的容器,容器具有最小软件包集,其中一个带有 Zypper,一个不带 Zypper 但带有 RPM,另一个不带 Zypper 和 RPM,这增加了开发环境的灵活性,删除了不必要的包,并加快了应用程序的部署和编排。 语言堆栈容器镜像,其基础环境能用于 Python、Node.js、Ruby、.NET、ASP.Net、Java(基于 OpenJDK)、Go 和 Rust 等编程语言。 应用程序堆栈容器镜像,能提供现成的容器化应用程序(如 RMT 和 PostgreSQL)。 BCI 的优势是什么? 可用性:BCI 可用于 x86-64、arch64、s390x 和 ppc64le。 安全性:容器镜像更安全,能减少容器漏洞扫描程序的通知数量。 BCI 用例是什么? BCI 提供了一个稳定、安全和开放的生态系统,用户可以在轻量灵活的环境中开发和部署应用程序,还能利用 SLES(SUSE Linux Enterprise Server)操作系统的稳定性和安全性。 另一方面,BCI 提供了以下机会: Rancher 用户: ①让 Rancher 能够使用稳定、可靠、安全和认证的企业组件进行构建。 ②利用 SUSE 内部操作系统知识,同时将应用程序容器化。这是因为工具是相同的,不需要迁移路径(例如,由于 BCI 会作为容器基础,因此用户可以将 Zypper 转为其它包管理器)。 开发者: ①如果用户不想为云原生环境进行付费订阅,则可以选择免费的 BCI。 ②BCI 可以部署在任何操作系统中,能帮助用户在多云厂商生态系统内迁移并避免云厂商锁定。 ISV(Independent Software Vendor): ①使用稳定、可靠、安全且经过认证的企业级操作系统来容器化应用程序。 ②使用免费的 Linux 来构建应用程序,无需在链中提供支持和安全服务。 ③容器化时进行导航(软件、工具、文档、咨询)。 ④在各种主机上运行应用程序。 BCI 中提供了哪些软件包和库? SUSE 提供了多种 BCI,开发人员可以随时选择符合需求的 BCI。同时,开发人员可以使用知名的工具和库,如编译器、加密库以及多种操作系统工具等,如下: 包管理器和工具,如 Zypper、RPM、sysctl 或 glibc。 库,如 lib-acl、lib-crypto、lib-openssl、libldap。 在 BCI 上构建产品需要哪些法律协议? 需要接受 SUSE Enterprise Linux 默认和标准的条款和条件。 Why? SUSE 为什么要推出 BCI? 我们希望为开发人员和集成商提供真正开放、灵活和安全的容器镜像和应用程序开发工具,避免用户受替代产品的限制。 为了满足受监管市场的需求,SUSE 计划提供经过专门强化和认证的 SLE 解决方案。 BCI 支持哪些硬件平台? BCI 在 x86_64、aarch64、ppcle64 和 s390x 上可用(.NET 镜像现在仅在 x86-64 上可用)。 How? 是否需要订阅才能使用 BCI? 不需要,无需订阅即可使用 BCI。 我是否需要 SUSE Linux 环境来构建基于 BCI 的镜像? 不需要,你可以在任何支持基于 OCI 镜像进行构建的环境中构建和运行 BCI。 部署 BCI 是否需要 SUSE Linux 环境? 不需要,你可以在任何经过认证的 Kubernetes Deployment 或任何与 OCI 兼容的运行时中运行 BCI。 我可以自由分发基于 BCI 构建的应用程序吗? 基于 BCI 重新分发应用程序是没有限制的,因此你可以通过 EULA 自由复制、使用、分发以及重新分发镜像。 我可以在不使用 SUSE 镜像仓库的情况下分发基于 BCI 的容器镜像吗? 如果 BCI 镜像可以免费生成、使用和分发,你可以使用任何镜像仓库来分发基于 BCI 的应用程序。 因此,是的,你可以根据需要分发基于 BCI 的应用程序。 我是否可以将非 BCI RPM 添加到 BCI 镜像,并继续在 SUSE 之外的平台上重新分发生成的容器镜像? 由于在提供的镜像上添加的所有内容都会被视为应用程序或依赖项,因此你可以将非 BCI-RPM 添加到镜像中。 如果你遵守 EULA,SUSE 对重新分发没有任何限制。 是否推荐将 BCI 用于社区项目? 是的。 BCI 会接收更新吗? 是的,我们通过 SUSE Linux Enterprise Server 仓库构建 BCI 镜像。我们为每个新的 SLE (SUSE Linux Enterprise) Service Pack 构建新的 BCI 镜像。 已发布 Service Pack 的 BCI 镜像会持续接收更新(例如安全更新)。 如何支持 BCI? 可以在 SUSE Lifecycle 仪表板中查看 BCI 的生命周期以及我们的其他产品。 基于 BCI 构建的应用程序是否受到支持? SUSE 支持可用的 BCI 镜像。 通过容器镜像交付的应用程序需要由其厂商或开发人员提供支持。 什么是 BCI 生命周期? 通用 BCI(General Purpose BCI)遵循 SLE Service Pack 的通用支持生命周期,可查阅 SUSE Linux Enterprise Server 的生命周期 应用程序和语言堆栈 BCI 的生命周期限制于对应的应用程序或语言堆栈,不与对应的 Service Pack 关联。有关详细信息,请参阅 SUSE 生命周期 长期服务包支持(Long Term Service Pack Support,LTSS)不支持 BCI 镜像。 如何在 BCI 中请求新功能? SUSE 内部:通过 https://jira.suse.com/projects/PM 请求新功能,并创建一个新的 PM Pool Epic。 BCI 是否支持将容器镜像分发到任何位置? 是的,SUSE 不会监督你处理及分发镜像的方式。你可以自由分发 BCI;如果你遵守 EULA,也可以根据需要分发应用程序。 如果 BCI 中缺少某些内容,我可以添加非 BCI 的包吗? 是的。但是由于 BCI 来自我们的镜像仓库,因此 SUSE 支持 BCI。将包添加到 BCI 是开发过程的一部分,但 SUSE 不直接支持此操作。

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册