Mysql 在我使用oracle和innodb的场景中最小化表死锁
我有35个函数,在一个事务中更新1到3个表。但是,它们不仅执行更新,还执行查询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的操作,我进行查询,然后进行更新,然后进行更多查询,有时进行更多更新。我必须重新设置代码才能不这
- 表1只执行行更新操作和一些查询
- 表2对现有行进行查询和行级更新,有时删除和添加行。表2在行删除和/或插入和/或更新前后的事务中可能有查询
- 表3根据上述表2操作的结果进行行更新
可能会同时更新两个表的同一行,我已经注意按相同的顺序对表进行更新。其中一个表有2个索引,似乎需要一个表锁来更新索引?一些函数在重复循环中查询表1、更新表1,然后可选地查询表2、更新表2。此表包含我的所有内容树中的所有父子关系,因此它是跨所有用户的高容量更新。首先,Oracle(我相信InnoDB)中的查询不会锁定,除非用于更新 其次,我不知道你的应用规模。您希望有多少并发事务?您是否希望它们更新相同的行 可能出现死锁的应用程序类型是预订或票务系统(例如,人们试图在剧院预订相同的座位),特别是在高并发情况下(新节目可用于预订) 如果您的应用程序符合此配置文件,那么您可能希望预测死锁情况。不过,我至少会考虑简单地捕获错误,回滚,然后重新尝试事务。如果您深入了解表结构、关系和更新条件的更多细节,那么锁定的适当点可能会变得明显