对于不同的数据库技术,MS-SQL 和 H2 最近,甚至对于不同的应用程序,我从无法获取表锁的语句中得到异常。
当从许多并行线程访问同一个表时,尤其会发生这种情况。假设使用足够复杂的语句和足够多的并行线程原则上无法避免这些冲突,那么处理这些失败语句的好方法是什么?
- MS-SQL 异常明确建议重试该语句。
- H2 允许设置 LOCK_TIMEOUT。
由于每个语句都可能以这种方式失败,因此软件中的每个语句都需要重试。似乎需要添加很多样板代码。
相比之下,timeout 是一个简单的配置,但需要设置的太高,才能保证不会再有几个线程再次触发异常。这让我回到了重试逻辑。
遗留代码包含十个语句,每个语句都以自己的方法实现,打开/关闭连接/语句/结果集的三元组。除了将它们中的每一个包装到重试循环中之外,还有什么好方法可以重构它?较低的性能是可以接受的,但没有失败的语句。