我有 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个索引,似乎需要表锁来更新索引?某些函数会查询表 1,更新表 1,然后(可选)查询表 2,然后更新表 2,重复循环。该表将所有父子关系保存在我所有内容的树中,因此它是所有用户的大量更新。

有帮助吗?

解决方案

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top