2012-01-12 93 views
0

java.sql.BatchUpdateException:事務(進程ID 58)是 死鎖的鎖資源與另一個進程,並已被選 作死鎖犧牲品。重新運行交易。與SQL Server 2008中移除死鎖問題,同時讀取和寫入數據

我有兩個Java應用程序,一個從sybase讀取數據並寫入到sql server 2008,另一個從sql server 2008表讀取數據並將其寫入其他表。現在這兩個應用程序工作正常。但是我有很多人從mssql表中訪問數據,第二個應用程序每30秒更新一次數據。所以我得到了上述例外。我在這裏看到了類似的螺紋計算器,但 Deadlock troubleshooting in Sql Server 2008 我有問題,在這裏提出的解決方案

行版本

我的用戶rowversioning能避免我的情況死鎖,我怎麼能使用它?

編輯

String selectAllQuery = "Select new_site_id from GIS.MAP.ro";  
    String selectQuery = "Select siteId from GIS.MAP.status where AlarmCode in ('1','2','3') and localNodeAlias like 'FLM%'"; 

    String updateQuery = "update GIS.MAP.ro set active_site_status = ? where new_site_id = ?"; 
    String updateAllQuery = "update GIS.MAP.ro set active_site_status = site_status where new_site_id = ?"; 

所以,我從GIS.MAP.status表和更新更新GIS.MAP.ro表中選擇。其實GIS.MAP.status表也更新每30秒(整個表被刪除,插入,但兩種任務

  1. 插入GIS.MAP.status在前,交易 致力於
  2. 更新GIS.MAP.ro表去第二和交易 致力於
  3. 最後,從GIS.MAP.ro的數據是由第三方應用程序許多用戶訪問。 其實僵局occours在這種情況下。

回答

1

在大多數情況下,死鎖表明您的實現有問題 - 查詢順序,鎖定順序或連接順序存在問題。我建議收集和分析你的死鎖(MSDN: Analyzing Deadlocks with SQL Server Profiler),這樣你可以在你的代碼中發現死鎖發生的確切位置並修復它們。

+0

當geoserver訪問正在修改的地圖數據列時發生死鎖。我認爲geoserver只使用select查詢而沒有任何內容。 – kinkajou 2012-01-12 11:30:06

+0

你的選擇有多簡單?例如,如果它使用子查詢,那麼如果其他進程正在修改相同的表,則可能會發生死鎖。 – 2012-01-12 11:46:56

+0

yes表正在被另一個進程修改,並且數據正被使用其他應用程序的人員使用。 – kinkajou 2012-01-12 11:50:16