【发布时间】:2011-07-12 01:01:58
【问题描述】:
我正在帮助解决死锁问题。环境:Tomcat 5.5、Java 5、Microsoft SQL Server 2008、jTDS(更换旧驱动程序)。我们有一个旧版连接池。
数据库代码总是遵循这个方案:
connection = connectionPool.getConnection(); // 1
boolean previousAutoCommitStatus = connection.getAutoCommit(); // 2
connection.setAutoCommit(false); // 3
// ... use the connection ...
// execute prepared statement 4
// execute prepared statement 5
// execute prepared statement 6
connection.commit(); // 7
connection.setAutoCommit(previousAutoCommitStatus); // 8
connectionPool.releaseConnection(connection); // 9
当我们寻找错误(请原谅:软件缺陷)时,我想知道:驱动程序是如何工作的?我的猜测:无论我在 (3) 和 (7) 之间做什么,都会由驱动程序/DBMS 排队。只有当我connection.commit() DBMS 开始一个新事务时,才获取操作所需的每个锁(我希望它足够聪明以锁定可能的较小对象集),执行语句并释放锁,从而关闭事务。
或者是我一执行准备好的语句,DBMS 就锁定了表?
编辑:我想了解的是,如果“commit()”转换为一组以“begin trans/lock table”开头并以“commit/unlock table”结尾的 SQL 语句,或者如果任何 Java executeStatement() 立即获取锁。
TIA
【问题讨论】:
-
你确定
setAutoCommit()(at 3) 不应该是setAutoCommit(false)?
标签: sql-server jdbc transactions