我正在使用 JDBC(通过 Spring 的 JDBCTemplate)访问数据库中的少量表。虽然我还没有发生任何事情,但我担心出现死锁的可能性。
我的印象是有一种方法可以为访问多个表的查询指定锁定顺序以避免死锁,但我不知道这是否是创建时在数据库级别设置的类型我的表,或者如果我必须用我的 JDBC 查询明确地做一些事情。
即是否有全局设置或用于指定锁定顺序的东西,或者是否必须在每次查询/更新时完成。
谢谢。
最佳答案
这将在事务级别进行管理。通常只有在出现先有鸡还是先有蛋的问题时,您才会冒死锁的风险。 IE。有两个同时进行的行锁定事务,每个查询的结果取决于其他 事务。如果在执行查询时 other 事务未完成,则 other 事务将无法完成自己的查询。
我不确定 JDBCTemplate 如何管理事务,但默认情况下 JDBC 连接不是事务性的。一旦你设置了 Connection#setAutoCommit()
设置为 false
(或将其配置为默认设置),然后事务将开始,并在您调用 Connection#commit()
时结束。 .
为避免死锁,规则 #1 避免在单个事务中混合使用 SELECT
和 INSERT/UPDATE/DELETE
语句。当混合 - 乍一看 - 强制性时,那么您至少应该尝试将其重写为单个/嵌套语句。这通常是可能的。这样您就不需要在事务中执行这些查询。
此外,某些数据库(如 PostgreSQL 和 Oracle)可以自动检测死锁并自动回滚其中一项事务,通常是稍后启动的事务。在 JDBC 端,您将收到一个特定的 SQLException
。
关于java - JDBC & 死锁避免题(基础),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3300399/