gpt4 book ai didi

mysql - 事务数据库和防止死锁

转载 作者:搜寻专家 更新时间:2023-10-30 23:44:11 24 4
gpt4 key购买 nike

我正在开发云服务,在该服务中将本地数据库(订单接收 POS 系统)同步到中央远程数据库。我们的远程数据库正在运行最新版本的 mysql 5.6,每个表都带有 innoDB 表引擎。基本上它作为一个事务数据库,经历了很多主要写入的事务(即插入和更新),有时在查看报告等时经历了阅读。我们不可避免地遇到了我们的第一个数据库死锁(请注意这发生在升级 mysql 5.6 之前),我对死锁原因的理解可能是有 2 个连接试图同时读取或写入一行。我也知道死锁很常见,需要正确的代码来尝试/捕获我认为我已经设法完成的死锁。为了减轻死锁,我正在考虑设置 2 个数据库,它们是彼此的镜像A)写入的数据库b) 读取的数据库

基本上,从本地到远程的同步将写入数据库 A,在后台使用 rsync 会将数据库 A 镜像到 B,而数据库 B 将用于读取和查询报告,因为 rsync 不使用数据库读取同步数据的连接。

我的问题是,这种结构是否可以缓解死锁并在服务器上产生任何重大性能问题?

我希望我的问题对我要实现的目标有意义。

提前致谢。

最佳答案

死锁不是两个连接试图同时写入同一行的结果。它只是比那复杂一点。

产生死锁的场景是这样的:

有两个资源(可以是表中的两行、两个表、两个文件等,我们将其标识为“A”和“B”)。

  1. 连接 #1 锁定资源“A”
  2. 连接 #2 锁定资源“B”
  3. 连接 #1 继续尝试锁定“B”(同时仍保持对“A”的锁定)。由于连接 #2 已锁定“B”,连接 #1 等待锁被释放
  4. 连接 #2(仍然锁定“B”)试图锁定“A”。由于连接 #1 已锁定“A”,连接 #2 等待该锁被释放。

两个连接现在都处于等待对方释放锁的状态;他们陷入僵局。死锁只能通过一个连接中止其释放锁的操作来打破,从而允许另一个连接完成。

这种事情可能发生在数据库中从行到页再到表的任何粒度级别,并且可能发生在数据或索引上。将它留给数据库引擎来执行它自己的乐观锁定通常可以为您提供最佳性能,但可能会导致死锁。您可能需要在可序列化事务中执行一些插入/更新操作(尽管这会降低性能)。将触及多个表的事务视为死锁场景中的潜在参与者。

关于mysql - 事务数据库和防止死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31063639/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com