JDBC commit():幕后发生了什么?

Man*_*zzi 2 sql-server transactions jdbc

我正在帮助解决僵局.环境: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
Run Code Online (Sandbox Code Playgroud)

虽然我们捕获了这个bug(原谅:软件缺陷)但我想知道:驱动程序是如何工作的?我的猜测:无论我在(3)和(7)之间做什么都由驱动程序/ DBMS排队.只有当我connection.commit()在DBMS开始一个新事务时,才获取操作所需的每个锁(我希望它足够智能来锁定较小的可能对象集),执行语句并释放锁,从而关闭事务.

或者,只要我执行准备好的语句,DBMS就会锁定表格吗?

编辑:我想要理解的是,"commit()"是否转换为一组以"begin trans/lock table"开头并以"commit/unlock table"结尾的SQL语句,或者是否有任何Java executeStatement()立即获取锁.

TIA

blo*_*lob 5

如果您对内部详细信息感兴趣,请参阅SQLServer JDBC实现的connection.com

发出以下命令

IF @@TRANCOUNT > 0 COMMIT TRAN
Run Code Online (Sandbox Code Playgroud)

@@ TRANCOUNT = 0 - 没有开放交易@@ TRANCOUNT = 1 - 1开放交易@@ TRANCOUNT = 10 - 10开放交易

在将autocommit设置为false时,

set implicit_transactions on
Run Code Online (Sandbox Code Playgroud)

这些是MS SQLServer特定的命令.