3

我正在加载测试应用程序并出现死锁错误。该场景是由 10 个不同的用户同时插入和更新数据库。我上网查了,还是没找到解决的办法。这里附上了我涉及死锁的示例代码。

谁能给我一些解决死锁的建议?先感谢您。

SampleController:

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

}

样品BO:

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

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

示例DAO:

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());
}
4

1 回答 1

0

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

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

我的钱在最后一个。

您可以通过执行 SQL 跟踪并准确识别正在运行的内容和时间来找出为什么会发生这些死锁。


每个都有自己的,但你知道你可以这样声明你的 sql 查询吗?@ 允许文本进入多行并转义特殊字符,如反斜杠。

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

sbSql = string.Format(sbSql, id);

WITH(ROWLOCK)可能也不需要。99.9% 的时间 SQL Server 将执行相关锁定,您应该只在复杂或特殊情况下显式强制某些锁定。

于 2012-08-19T23:08:22.927 回答