2010-07-21 153 views
4

我使用JDBC(通过Spring的JDBCTemplate)访问数据库中的少量表。虽然我还没有发生任何事情,但我担心死锁的可能性。JDBC和死锁避免问题(基本)

我的印象是有一种方法来指定查询的锁定顺序,以访问多个表以避免死锁,但我不知道这是否是在数据库级别设置的类型创建我的表,或者如果我必须明确地用我的JDBC查询做些事情。

即,是否有全局设置或用于指定锁定顺序的东西,或者是否必须在每个查询/更新中完成。

谢谢。

回答

5

这是要在事务级别进行管理。当鸡蛋问题存在时,您通常只会面临僵局。即每个多个查询有两个同时行锁定事务,其结果取决于事务的其他其他事务。如果其他交易在执行查询时未完成,那么其他交易将不能完成其自己的查询。

我不确定JDBCTemplate如何管理事务,但JDBC连接默认情况下不是事务性的。一旦您将Connection#setAutoCommit()设置为false(或将其配置为默认值),则交易将开始并在您致电Connection#commit()时完成。

为避免死锁,规则#1避免在单个事务中混合SELECTINSERT/UPDATE/DELETE语句。当混合是一见钟情时,那么你至少应该尝试将它重写成一个/嵌套语句。这通常是可能的。这样你就不需要在事务中执行这些查询。此外,像PostgreSQL和Oracle这样的一些数据库可以自动检测死锁,并且会自动回滚其中一个事务,通常是稍后启动的事务。在JDBC端,您将收到一个特定的SQLException

+0

因此,我应该不是做像测试存在然后插入的东西,或者它是唯一危险的,如果我做一个选择,将查看多行,然后插入,如果没有找到结果? – 2010-07-21 19:05:30

+0

非常真实:)而是捕捉到独特的约束。另见[这个答案](http://stackoverflow.com/questions/3101820/how-to-check-for-duplicate-entries-in-database/3101957#3101957)。 – BalusC 2010-07-21 19:14:56