因此,我最近发现了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,它将整个过程包装成一个带有计数器的循环,并在每次尝试之间进行睡眠。
所以,我的目的是:
编辑:我在MySQL documentation上找到了这个
如果由于死锁而失败,则始终准备重新发出事务。死锁并不危险。再试一次。
建议在应用程序代码上进行处理。
有什么想法吗?预先谢谢你。
答案 0 :(得分:1)
尽管缓解死锁可能有一定价值,但在设计良好的系统中死锁应该非常少见。您提到了学习一些避免方法的提示,但这是我自己的列表:
如果允许用户对数据库进行临时写访问,那么您当然无法控制导致死锁的因素。但是我从未见过允许它使用的严肃系统。
因此,不必担心响应死锁,而应将所有精力都花在完全避免死锁上。当您看到死锁时,您会在系统中发现允许死锁发生的错误。