Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在我使用oracle和innodb的场景中最小化表死锁_Mysql_Oracle_Innodb_Deadlock_Database Deadlocks - Fatal编程技术网

Mysql 在我使用oracle和innodb的场景中最小化表死锁

Mysql 在我使用oracle和innodb的场景中最小化表死锁,mysql,oracle,innodb,deadlock,database-deadlocks,Mysql,Oracle,Innodb,Deadlock,Database Deadlocks,我有35个函数,在一个事务中更新1到3个表。但是,它们不仅执行更新,还执行查询 表1只执行行更新操作和一些查询 表2对现有行进行查询和行级更新,有时删除和添加行。表2在行删除和/或插入和/或更新前后的事务中可能有查询 表3根据上述表2操作的结果进行行更新 我的第一个动作是确保表3的更新都在最后完成 表1独立于其他两个表,可能是第一个或最后一个。 所以表2必须在表3更改之前 我首先关心的是,对于表2的操作,我进行查询,然后进行更新,然后进行更多查询,有时进行更多更新。我必须重新设置代码才能不这

我有35个函数,在一个事务中更新1到3个表。但是,它们不仅执行更新,还执行查询

  • 表1只执行行更新操作和一些查询
  • 表2对现有行进行查询和行级更新,有时删除和添加行。表2在行删除和/或插入和/或更新前后的事务中可能有查询
  • 表3根据上述表2操作的结果进行行更新
我的第一个动作是确保表3的更新都在最后完成

表1独立于其他两个表,可能是第一个或最后一个。 所以表2必须在表3更改之前

我首先关心的是,对于表2的操作,我进行查询,然后进行更新,然后进行更多查询,有时进行更多更新。我必须重新设置代码才能不这样做吗

我的第二个担忧是表3是一个具有servlet线程的表,它必须是快速的。表3本身用于简单查询。但行级锁似乎可以阻止这些查询

如果有必要,我可以从一个线程将上述表集维护代码放在一个集群范围的进程中。更新的速度并不重要。只是表3的查询速度很快。而且从来没有任何僵局

我不知道Oracle和Innodb之间的区别,所以我有一些问题。(我计划稍后升级到Oracle。)

基本上,我在寻找关于要注意什么的指针。当然,我可以在每个updater函数的开头对表2和表3强制一个完整的表锁,但是我的Table3Servlet查询线程会受到影响。所以这似乎不是一个解决方案

另外,我担心的是相对于表2本身,有些函数会执行查询、基于查询的更新、基于更新的新查询,然后执行更多更新,包括将结果传递到表3的更新。这看起来真的很糟糕

推荐? 安迪


可能会同时更新两个表的同一行,我已经注意按相同的顺序对表进行更新。其中一个表有2个索引,似乎需要一个表锁来更新索引?一些函数在重复循环中查询表1、更新表1,然后可选地查询表2、更新表2。此表包含我的所有内容树中的所有父子关系,因此它是跨所有用户的高容量更新。

首先,Oracle(我相信InnoDB)中的查询不会锁定,除非用于更新

其次,我不知道你的应用规模。您希望有多少并发事务?您是否希望它们更新相同的行

可能出现死锁的应用程序类型是预订或票务系统(例如,人们试图在剧院预订相同的座位),特别是在高并发情况下(新节目可用于预订)

如果您的应用程序符合此配置文件,那么您可能希望预测死锁情况。不过,我至少会考虑简单地捕获错误,回滚,然后重新尝试事务。如果您深入了解表结构、关系和更新条件的更多细节,那么锁定的适当点可能会变得明显