【问题标题】:removing deadlock issue with sql server 2008 while reading and writing data在读取和写入数据时消除 sql server 2008 的死锁问题
【发布时间】:2012-01-12 10:35:55
【问题描述】:

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

我有两个 java 应用程序,一个从 sybase 读取数据并写入 sql server 2008,另一个从 sql server 2008 表读取数据并将其写入另一个表。现在这两个应用程序工作正常。但是我有很多人从 mssql 表中访问数据,其中第二个应用程序每 30 秒更新一次数据。所以我得到了上述异常。我在stackoverflow中看到了类似的线程但是 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 的数据被许多用户通过第三方应用程序访问。 其实死锁发生在这种情况下。

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • geoserver 访问正在修改的地图数据列时发生死锁。我认为 geoserver 只使用 select 查询,什么都没有。
    • 您的选择有多简单?例如,如果它使用子查询,如果另一个进程正在修改相同的表,它可能会死锁
    • 是的,表正在被另一个进程修改,数据正在被使用另一个应用程序的人使用。
    • 好吧,你能显示修改和选择的确切查询吗? CREATE TABLE 语句也可能有用。
    • 我添加了我写的查询,但是第三方应用程序应该生成简单的选择查询,而不是更新和插入查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多