0

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

  • 表 1 只更新行操作和一些查询。
  • 表 2 对现有行进行查询和行级别更新,有时还会删除和添加行。表 2 可能在行删除和/或插入,和/或更新之前和之后在事务中具有查询。
  • 表 3 根据上述表 2 操作的结果进行行更新。

我的第一个动作是确保表 3 的更新都在最后完成。

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

我首先担心的是,对于表 2 操作,我先进行查询,然后进行更新,然后再进行更多查询,有时还会进行更多更新。我是否必须重组我的代码才能不这样做。

我的第二个担心是表 3 是带有 servlet 线程的表必须很快。表 3 本身用于简单查询。但似乎行级锁会停止这些查询。

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

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

基本上,我正在寻找有关注意事项的指示。当然,我可以在每个更新程序函数的开头强制对表 2 和表 3 进行全表锁定,但是这样我的 Table3 servlet 查询线程就会受到影响。所以这似乎不是一个解决方案。

此外,我担心仅相对于表 2 本身,某些函数会执行查询、基于查询的更新、基于更新的新查询,然后是更多更新,包括将结果流向表 3 的更新。这似乎真的很讨厌。

建议?安迪

可能会同时更新 2 个表的相同行,并且我已经注意以相同的顺序使用更新来命中表。其中一个表有 2 个索引,并且似乎需要一个表锁来更新索引?一些函数查询表 1,更新表 1,然后可选地查询表 2,然后更新表 2,重复循环。该表将所有父子关系保存在我所有内容的树中,因此它是跨所有用户的大量更新。

4

1 回答 1

2

首先,除非您使用 FOR UPDATE,否则 Oracle(我相信 InnoDB)中的查询不会锁定。

其次,我对您的应用程序规模一无所知。您期望有多少并发事务?您是否希望他们更新相同的行?

可能会遇到死锁的应用程序是预订或票务系统(例如,人们试图在剧院预订相同的座位),尤其是在高并发情况下(新节目可供预订)。

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

于 2010-08-04T06:28:16.810 回答