在同时执行UPDATE时获取死锁

时间:2012-04-27 21:56:59

标签: sql deadlock

我正在加载测试应用程序并出现死锁错误。该场景是由10个不同的用户同时插入和更新数据库。我在网上查了一下,仍然无法找到解决问题的方法。这里附有我参与死锁的示例代码。

有人能给我一些解决僵局的建议吗?提前谢谢。

SampleController:

onSubmit(userAccount)
{
     sampleBO.testDeadLock(userAccount.getUserAccountId());

}

SampleBO:

public void testInsert(Long id)
{
    sampleDAO.testInsert4(id);      
}

public void testDeadLock(Long id)
{
    testInsert(id);
    sampleDAO.testUpdate4(id);  
}

SampleDAO:

public void testInsert4(Long id)
{
    StringBuffer sbSql = new StringBuffer();
    sbSql.append(" INSERT INTO Test ");
    sbSql.append(" ( ");
    sbSql.append(" id, ");
    sbSql.append(" note ");
    sbSql.append(" ) ");
    sbSql.append(" VALUES ");
    sbSql.append(" (");
    sbSql.append(""+id+",");
    sbSql.append(" 'test' ");
    sbSql.append(" )");

    //Execute SQL using Spring's JDBC Templates
    this.getSimpleJdbcTemplate().update(sbSql.toString());
}

public void testUpdate4(Long id)
{       
    StringBuffer sbSql = new StringBuffer();
    sbSql.append(" UPDATE Test WITH(ROWLOCK) SET ");
    sbSql.append(" note = 'test1111'");
    sbSql.append(" WHERE id="+id);

    //Execute SQL using Spring's JDBC Templates
    this.getSimpleJdbcTemplate().update(sbSql.toString());
}

1 个答案:

答案 0 :(得分:0)

如果发生死锁,则不是来自您提供的代码,除非:

  • 您有多个此测试程序的实例同时运行。
  • 上面的代码是异步运行的 - 但情况似乎并非如此。
  • 运行这些测试时,数据库上还有其他活动。

我的钱在最后一个。

您可以通过执行SQL跟踪并准确识别正在运行的内容以及何时发现这些死锁的原因。


每个都是他们自己的,但你知道你可以像这样声明你的SQL查询吗? @允许文本转到多行,也可以转义反斜杠等特殊字符。

string sbSql = @"
    INSERT INTO Test (id, note)
    VALUES ({0}, 'test')";

sbSql = string.Format(sbSql, id);

可能也不需要WITH(ROWLOCK)。 99.9%的时间SQL服务器将执行相关锁定,您应该只针对复杂或特殊情况明确强制某些锁定。