Sql 同时执行更新时出现死锁
我正在对应用程序进行负载测试,结果出现死锁错误。该场景由10个不同的用户同时插入和更新数据库。我在网上查了一下,仍然找不到解决问题的方法。这里附上了我的死锁示例代码 有谁能给我一些解决僵局的建议吗?先谢谢你Sql 同时执行更新时出现死锁,sql,deadlock,Sql,Deadlock,我正在对应用程序进行负载测试,结果出现死锁错误。该场景由10个不同的用户同时插入和更新数据库。我在网上查了一下,仍然找不到解决问题的方法。这里附上了我的死锁示例代码 有谁能给我一些解决僵局的建议吗?先谢谢你 SampleController: onSubmit(userAccount) { sampleBO.testDeadLock(userAccount.getUserAccountId()); } SampleBO: public void testInsert(Long i
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查询吗?@允许文本进入多行,还可以转义反斜杠等特殊字符
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风格吗?