【发布时间】: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秒更新一次(整个表被删除和插入但是两个任务
- 首先插入 GIS.MAP.status 并且事务是 承诺
- 更新 GIS.MAP.ro 表是第二个和事务 已承诺
- 最后,来自 GIS.MAP.ro 的数据被许多用户通过第三方应用程序访问。 其实死锁发生在这种情况下。
【问题讨论】:
标签: java sql sql-server sql-server-2008