【发布时间】:2010-07-26 08:35:57
【问题描述】:
我们运行一个用 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 分钟。要么我需要摆脱事务,要么我需要在事务期间释放锁。
【问题讨论】:
-
“不在事务中运行”?你确定吗? AFAIK 每个 SQL 语句都在事务中运行。最接近“无事务”的可能是自动提交,即每条语句都在其自己的会话中执行。
-
我可以用实际的术语解释我的意思:如果我运行“EXEC dbo.procTest;”使用 SQL Server Management Studio 然后网站不会锁定。但是如果我运行“BEGIN TRANSACTION; EXEC dbo.procTest; COMMIT;”然后网站在事务期间锁定 - 监视数据库锁定表明网站连接都在等待执行该存储过程的线程。也许交易不是这里的重点。我可以说的另一种方式是“我不希望数据库在事务期间锁定更新的对象”。
-
你试过
Connection.TRANSACTION_READ_UNCOMMITTED吗?
标签: java sql-server jdbc jtds