MySQL与SQL Server死锁异常处理:SQL Server对应异常及重试方案咨询
SQL Server死锁场景的异常处理与重试逻辑
异常类型判断
SQL Server没有专门的死锁异常类,死锁发生时JDBC驱动会抛出SQLServerException,需要通过错误码识别死锁场景:
- 死锁对应的核心错误码是
1205(官方定义的“事务被选为死锁牺牲品”错误) - 辅助判断依据:SQL状态码通常为
40001(表示序列化失败)
异常处理与重试代码示例
catch (SQLServerException ex) { // 判定是否为死锁场景 if (ex.getErrorCode() == 1205 || "40001".equals(ex.getSQLState())) { // 执行重试逻辑,注意限制重试次数 retryUpdateOperation(); } else { // 非死锁异常,正常抛出或按业务逻辑处理 throw ex; } }
跨数据库兼容的优化方案
可以抽象一个工具方法统一判断死锁,同时兼容MySQL和SQL Server:
public static boolean isDeadlockException(Exception ex) { if (ex instanceof MySQLTransactionRollbackException) { return true; } if (ex instanceof SQLServerException) { SQLServerException sqlEx = (SQLServerException) ex; return sqlEx.getErrorCode() == 1205 || "40001".equals(sqlEx.getSQLState()); } // 其他数据库类型可在此扩展判断逻辑 return false; }
使用时只需在catch块中调用该方法:
catch (Exception ex) { if (isDeadlockException(ex)) { // 执行重试逻辑 } else { throw ex; } }
关键注意事项
- 必须限制重试次数,避免因持续死锁导致无限循环
- 重试前可添加短暂休眠(如
Thread.sleep(100)),降低再次触发死锁的概率
内容的提问来源于stack exchange,提问作者Vinita Shah
相关产品推荐
相关产品推荐

