700*_*are 5 mysql innodb oracle deadlock
对我来说,MySQL 不会在内部处理这个问题似乎很奇怪:“尝试获取锁时发现死锁;尝试重新启动事务”
Oracle DB 是否可以解决此问题?毕竟,Oracle 拥有 InnoDB。
Jus*_*ave 12
一般来说,没有任何数据库可以解决死锁错误——在 Oracle 中,死锁表示应用程序中的错误,而不是数据库中的错误。Oracle 数据库将检测死锁情况(即会话 A 有一个会话 B 正在等待的锁,而会话 B 有一个会话 A 正在等待的锁)并终止被阻塞的语句之一来解决问题。您的应用程序应该首先避免创建死锁——一个选择是在每个会话中始终以相同的顺序生成锁。
死锁检测和解决问题与 RDBMS 一样存在。即使 Oracle 拥有 InnoDB,也不要指望 Oracle 修复 InnoDB。大多数应用程序是死锁的罪魁祸首,而不是 RDBMS。无论是 Oracle、MySQL 还是任何其他 RDBMS,死锁错误都会引起它的丑陋。
甲骨文于 2005 年 10 月 7 日收购了 InnoDB,当时 InnoBase Oy 与 MySQL 的合作关系到期,MySQL 更新松懈。恕我直言,甲骨文试图通过这样做来阻止 MySQL 的潮流。当然,它已经承诺改进 InnoDB 和 MySQL。由于公关和可能的反垄断问题,它现在别无选择。有鉴于此,我们不应期望 InnoDB 的改进会盖过或变得可与 Oracle 相媲美。
现在远离商业政治,单独看看 InnoDB。它有变量innodb_lock_wait_time。该选项用于增加或减少允许锁定成功的时间长度,仅此而已。
如果内部发生死锁,我通常会将聚集索引视为 InnoDB 中的牺牲品,因为非聚集索引也会拖动聚集索引指针。在更新索引列的 InnoDB 中更新一行,我预计由于聚集索引会发生死锁。执行SELECT ... FOR UPDATE 或 SELECT ... LOCK IN SHARE MODE可能会使问题更加严重。
Oracle 如何在内部处理它(如果他们已经处理过)将是使其优于 MySQL 的众多因素之一。我不希望 Oracle 为开源/免费软件产品提供同样的优势,除非它是 Oracle XE。
死锁是所有数据库中的常态,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
Run Code Online (Sandbox Code Playgroud)
甲骨文已经有很长一段时间是MVCC的一个很好的实现-在非常有用的阅读它概念指南。
我只想补充一点,拥有 InnoDB 的 Oracle 不太可能对 InnoDB 在并发控制级别的深层工作产生太大影响——尽管据我所知,它们实现 MVCC 的方式基本上实现了相同的目标(只要你是不要在你的 MySQL 查询中混合使用其他存储引擎的表- 尽管在这种情况下你不能挑剔 InnoDB)
| 归档时间: |
|
| 查看次数: |
1186 次 |
| 最近记录: |