700 Software Asked: 2011-08-10 05:28:56 +0800 CST2011-08-10 05:28:56 +0800 CST 2011-08-10 05:28:56 +0800 CST Oracle DB 是否不受 MySQL 中发现的 InnoDB 死锁的影响? 772 对我来说,MySQL 不会在内部处理这个问题似乎很奇怪:“尝试获取锁时发现死锁;尝试重新启动事务” Oracle DB 是否可以解决此问题?毕竟,Oracle 拥有 InnoDB。 mysql oracle 3 个回答 Voted Best Answer Justin Cave 2011-08-10T08:54:31+08:002011-08-10T08:54:31+08:00 一般来说,没有数据库可以解决死锁错误——在 Oracle 中,死锁表示应用程序中的错误,而不是数据库中的错误。Oracle 数据库将检测死锁情况(即会话 A 拥有会话 B 正在等待的锁,会话 B 拥有会话 A 正在等待的锁)并终止其中一个被阻塞的语句以解决问题。您的应用程序应该首先避免产生死锁——一个选择是始终在每个会话中以相同的顺序生成锁。 RolandoMySQLDBA 2011-08-10T09:26:59+08:002011-08-10T09:26:59+08:00 自 RDBMS 以来,死锁检测和解决问题就一直存在。即使 Oracle 拥有 InnoDB,也不要指望 Oracle 修复 InnoDB。大多数应用程序都是死锁的罪魁祸首,而不是 RDBMS。无论是 Oracle、MySQL 还是任何其他 RDBMS,死锁错误都会抬起头来。 Oracle 于 2005 年 10 月 7 日收购了 InnoDB,当时 InnoBase Oy 与 MySQL 之间的合作伙伴关系到期,而 MySQL 在更新方面松懈。恕我直言,甲骨文试图通过这样做来阻止 MySQL 的潮流。当然,它已经承诺改进 InnoDB 和 MySQL。由于公关和可能的反垄断问题,它现在别无选择。有鉴于此,我们不应该期望 InnoDB 有超越 Oracle 或与 Oracle 相媲美的改进。 现在远离商业政治,单独看看 InnoDB。它有变量innodb_lock_wait_time。该选项用于增加或减少允许锁定成功的时间长度,仅此而已。 如果死锁发生在内部,我通常会将聚集索引视为 InnoDB 中的牺牲品,因为非聚集索引也会拖累聚集索引指针。在更新索引列的 InnoDB 中更新一行,我预计由于聚簇索引会发生死锁。执行SELECT ... FOR UPDATE 或 SELECT ... LOCK IN SHARE MODE可能会使问题更加严重。 Oracle 如何在内部处理它(如果他们已经处理过)将是使其优于 MySQL 的一长串事情之一。我不希望 Oracle 为开源/免费软件产品提供同样的优势,除非它是 Oracle XE。 Jack Douglas 2011-08-10T09:58:56+08:002011-08-10T09:58:56+08:00 死锁是所有数据库都存在的事实,Oracle 也不例外。在这种情况下没有什么魔法可以做到——这是并发的基本结果(允许多个用户同时访问数据而不损害完整性): create table t(id integer primary key); --session 1 insert into t(id) values(1); --session 2: insert into t(id) values(2); --completes immediately insert into t(id) values(1); --waits for session 1 to commit or rollback --session 1 insert into t(id) values(2); --session 1 gets: SQL Error: ORA-00060: deadlock detected while waiting for resource Oracle 长期以来一直拥有出色的 MVCC 实现——在非常有用的概念指南中阅读它。 我只想补充一点,拥有 InnoDB 的 Oracle 不太可能对 InnoDB 在并发控制级别的深入工作方式产生太大影响——尽管据我了解,它们实现 MVCC 的方式基本上实现了相同的目标(只要你是不要在你的 MySQL 查询中混合使用其他存储引擎的表——尽管在那种情况下你不能指责 InnoDB)
一般来说,没有数据库可以解决死锁错误——在 Oracle 中,死锁表示应用程序中的错误,而不是数据库中的错误。Oracle 数据库将检测死锁情况(即会话 A 拥有会话 B 正在等待的锁,会话 B 拥有会话 A 正在等待的锁)并终止其中一个被阻塞的语句以解决问题。您的应用程序应该首先避免产生死锁——一个选择是始终在每个会话中以相同的顺序生成锁。
自 RDBMS 以来,死锁检测和解决问题就一直存在。即使 Oracle 拥有 InnoDB,也不要指望 Oracle 修复 InnoDB。大多数应用程序都是死锁的罪魁祸首,而不是 RDBMS。无论是 Oracle、MySQL 还是任何其他 RDBMS,死锁错误都会抬起头来。
Oracle 于 2005 年 10 月 7 日收购了 InnoDB,当时 InnoBase Oy 与 MySQL 之间的合作伙伴关系到期,而 MySQL 在更新方面松懈。恕我直言,甲骨文试图通过这样做来阻止 MySQL 的潮流。当然,它已经承诺改进 InnoDB 和 MySQL。由于公关和可能的反垄断问题,它现在别无选择。有鉴于此,我们不应该期望 InnoDB 有超越 Oracle 或与 Oracle 相媲美的改进。
现在远离商业政治,单独看看 InnoDB。它有变量innodb_lock_wait_time。该选项用于增加或减少允许锁定成功的时间长度,仅此而已。
如果死锁发生在内部,我通常会将聚集索引视为 InnoDB 中的牺牲品,因为非聚集索引也会拖累聚集索引指针。在更新索引列的 InnoDB 中更新一行,我预计由于聚簇索引会发生死锁。执行SELECT ... FOR UPDATE 或 SELECT ... LOCK IN SHARE MODE可能会使问题更加严重。
Oracle 如何在内部处理它(如果他们已经处理过)将是使其优于 MySQL 的一长串事情之一。我不希望 Oracle 为开源/免费软件产品提供同样的优势,除非它是 Oracle XE。
死锁是所有数据库都存在的事实,Oracle 也不例外。在这种情况下没有什么魔法可以做到——这是并发的基本结果(允许多个用户同时访问数据而不损害完整性):
Oracle 长期以来一直拥有出色的 MVCC 实现——在非常有用的概念指南中阅读它。
我只想补充一点,拥有 InnoDB 的 Oracle 不太可能对 InnoDB 在并发控制级别的深入工作方式产生太大影响——尽管据我了解,它们实现 MVCC 的方式基本上实现了相同的目标(只要你是不要在你的 MySQL 查询中混合使用其他存储引擎的表——尽管在那种情况下你不能指责 InnoDB)