我正在加载测试应用程序并出现死锁错误。该场景是由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());
}
答案 0 :(得分:0)
如果发生死锁,则不是来自您提供的代码,除非:
我的钱在最后一个。
您可以通过执行SQL跟踪并准确识别正在运行的内容以及何时发现这些死锁的原因。
每个都是他们自己的,但你知道你可以像这样声明你的SQL查询吗? @允许文本转到多行,也可以转义反斜杠等特殊字符。
string sbSql = @"
INSERT INTO Test (id, note)
VALUES ({0}, 'test')";
sbSql = string.Format(sbSql, id);
可能也不需要WITH(ROWLOCK)
。 99.9%的时间SQL服务器将执行相关锁定,您应该只针对复杂或特殊情况明确强制某些锁定。