Sql 同时执行更新时出现死锁

Sql 同时执行更新时出现死锁,sql,deadlock,Sql,Deadlock,我正在对应用程序进行负载测试,结果出现死锁错误。该场景由10个不同的用户同时插入和更新数据库。我在网上查了一下,仍然找不到解决问题的方法。这里附上了我的死锁示例代码 有谁能给我一些解决僵局的建议吗?先谢谢你 SampleController: onSubmit(userAccount) { sampleBO.testDeadLock(userAccount.getUserAccountId()); } SampleBO: public void testInsert(Long i

我正在对应用程序进行负载测试,结果出现死锁错误。该场景由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);  
}
样本道:

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

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

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

您可以通过执行SQL跟踪并准确确定运行的内容和时间来找出这些死锁发生的原因


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

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

sbSql = string.Format(sbSql, id);

可能也不需要带(ROWLOCK)的
。SQL server执行相关锁定的时间占99.9%,您只应在复杂或特殊情况下明确强制某些锁定。

SQL的品牌和版本是什么?此外,请发布表定义,包括任何键、索引、约束和/或触发器,因为90%的可能性就是问题所在。我是不是遗漏了什么?看起来您正在同步调用两个执行,因此testUpdate4调用不应在insert 1完成之前启动。您好,我不确定您是否遇到死锁,您的代码不够复杂,无法导致死锁。你能描述一下为什么你认为你是死锁,你收到的错误,最重要的是你正在使用的SQL风格吗?