我们运行一个用 Java 编写的网站,该网站使用 JDBC 和 jTDS 来访问 SQL Server 数据库。
我们的数据库包含一个复杂的存储过程,通常需要 10 分钟才能运行。如果我们直接执行存储过程(例如从 SQL Server Management Studio),存储过程可以正常工作,因为它不在事务中运行。但是如果我们使用 jTDS 执行它,它会锁定整个网站 10 分钟。发生这种情况是因为 jTDS 在事务中运行它,因此所有网站请求都处于暂停状态,等待事务完成。
例如,以下由于交易而锁定网站:
Connection connection = DriverManager.getConnection("jdbc:jtds:sqlserver://example/example");
CallableStatement callableStatement = connection.prepareCall("exec dbo.procTest");
callableStatement.execute();
有没有什么方法可以让我们使用 JDBC / jTDS 运行存储过程,而无需在事务中运行?
请注意,在 jTDS 连接上调用它是无效的:
connection.setTransactionIsolation(Connection.TRANSACTION_NONE);
这会引发一个异常,指出 jTDS 不支持 Connection.TRANSACTION_NONE 参数。
编辑:我可能会更好地问这个问题:核心问题不是事务本身,问题是事务导致数据库锁定保持 10 分钟。要么我需要摆脱事务,要么我需要在事务期间释放锁。