在读取和写入数据时删除sql server 2008的死锁问题

时间:2012-01-12 10:35:56

标签: java sql sql-server sql-server-2008

  

java.sql.BatchUpdateException:事务(进程ID 58)是   锁定资源与另一个进程死锁并已被选中   作为死锁的受害者。重新运行该交易。

我有两个java应用程序,一个从sybase读取数据并写入sql server 2008,另一个从sql server 2008表读取数据并将其写入其他表。现在两个应用程序工作正常。但我有很多人从mssql表访问数据,其中第二个应用程序每30秒更新一次数据。所以我得到了上述异常。我在stackoverflow中看到类似的线程但是 Deadlock troubleshooting in Sql Server 2008 我对此处提供的解决方案有问题

  

行版本控制

我可以使用rowversion来避免在我的情况下死锁吗?我怎么能用它?

修改

    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的数据。 实际上,此实例会出现死锁。

1 个答案:

答案 0 :(得分:1)

在大多数情况下,死锁表明您的实现存在问题 - 查询顺序,锁定顺序或连接顺序存在问题。我建议收集并分析你的死锁(MSDN: Analyzing Deadlocks with SQL Server Profiler),这样你就可以在代码中找到发生死锁的确切位置并修复它们。