我們運行一個用Java編寫的網站,該網站使用JDBC和jTDS訪問SQL Server數據庫。如何在不使用事務的情況下使用JDBC/jTDS執行存儲過程?
我們的數據庫包含一個複雜的存儲過程,通常需要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);
拋出異常,指出Connection.TRANSACTION_NONE參數不受JTDS支持。
編輯:我可能問更好的問題:核心問題不是交易本身,問題是,事務中保持10分鐘數據庫鎖。我需要擺脫交易,或者我需要在交易期間發佈的鎖。
「不在交易中運行」?你確定? AFAIK每個SQL語句都在一個事務中運行。最接近「無事務」的可能是自動提交,每個語句都在自己的會話中執行。 – 2010-07-26 08:38:20
我可以用實際的術語解釋我的意思:如果我運行「EXEC dbo.procTest;」使用SQL Server Management Studio,那麼網站不會鎖定。但是如果我運行「BEGIN TRANSACTION; EXEC dbo.procTest; COMMIT;」那麼該網站在事務期間鎖定 - 監視數據庫鎖定表明網站連接都在執行該存儲過程的線程上等待。 也許交易不是這裏的關鍵。另一種我能說的方式是「我不希望數據庫在交易期間鎖定更新的對象」。 – gutch 2010-07-27 00:00:07
你嘗試過'連接嗎?TRANSACTION_READ_UNCOMMITTED'? – nilskp 2011-04-25 17:22:43