我正在帮助进行僵局狩猎。环境: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
当我们寻找错误(原谅:软件缺陷)时,我想知道:驱动程序如何工作?我的猜测:驱动程序/ DBMS将我在(3)和(7)之间执行的操作排队。只有当我
connection.commit()
DBMS开始新事务时,获取操作所需的每个锁(我希望它足够聪明来锁定较小的对象集),执行语句并释放该锁,从而关闭事务。还是我执行一条准备好的语句后,DBMS就会锁定该表?
编辑:我想了解的是,如果“ commit()”转换为以“开始传输/锁定表”开始并以“提交/解锁表”结束的一组SQL语句,或者如果任何Java
executeStatement()
立即获得了锁定, 。TIA
最佳答案
如果您对内部细节感兴趣,
在connection.commit上的SQLServer JDBC实现
发出以下命令
IF @@TRANCOUNT > 0 COMMIT TRAN
@@ TRANCOUNT = 0-无公开交易
@@ TRANCOUNT = 1-1个未平仓交易
@@ TRANCOUNT = 10-10未平仓交易
将autocommit设置为false时,
set implicit_transactions on
这些是MS SQLServer特定的命令。
关于sql-server - JDBC commit():幕后发生了什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5248649/