【发布时间】:2019-09-25 04:20:17
【问题描述】:
所以,我最近发现了deadlocks 的存在。尽管我从未有过,但我知道这可能是测试环境之外的问题,因为有很多用户同时访问。
我学到了一些技巧来实现它更少,但不是永远不会,所以我担心正确处理这个问题。所以,假设我们通过 JDBC 访问数据库。
我在documentation 和official examples 中都没有找到对死锁处理的任何引用,因为它们只是回滚(或者如果不可能,则打印和异常):
} catch (SQLException e ) { JDBCTutorialUtilities.printSQLException(e); if (con != null) { try { System.err.print("Transaction is being rolled back"); con.rollback(); } catch(SQLException excep) { JDBCTutorialUtilities.printSQLException(excep); } } }
据我了解阅读文档,如果 executeUpdate() 方法发现死锁,它不会以任何方式重试。
搜索不同的解决方案我找到了this approach,它将整个事情包装成一个循环,每次尝试之间都有一个计数器和一个睡眠。
所以,我的问题是:
- 除了抛出异常之外,JDBC 是否以任何方式处理死锁?任何语言的任何库都会(至少可选地)重试查询?
- 在使用 JDBC 实现的死块敏感场景中,您将如何处理此问题?
- 您是否在自定义数据库访问方法中防止这种情况发生?另外,您是否拥有它们,或者您每次访问数据库时只使用默认行?
- 当需要的行被解锁时,为什么数据库引擎不重新启动受害者查询?
编辑:我在 MySQL documentation 上找到了这个:
如果由于死锁而失败,请随时准备重新发出事务。死锁并不危险。请再试一次。
这建议在应用程序代码上处理它。
有什么想法吗?提前谢谢你。
【问题讨论】:
-
1.不,它不会,因为它不能。死锁是需要在业务逻辑中处理的错误。 2. 没有专门针对 JDBC 的解决方案。为什么?因为处理死锁取决于您的业务逻辑,所以没有一种万能的方法来处理死锁。
标签: java mysql sql jdbc database-deadlocks