【发布时间】:2012-04-27 21:56:58
【问题描述】:
我正在对应用程序进行负载测试并遇到死锁错误。该场景是由 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);
}
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());
}
【问题讨论】:
-
SQL 的品牌和版本是什么?
-
另外,请发布表定义,包括任何键、索引、约束和/或触发器,因为问题所在的可能性为 90%。
-
我错过了什么吗?看起来您正在同步调用两个执行,因此 testUpdate4 调用不应在插入完成之前触发。
-
您好,我不确定您是否遇到了死锁,您的代码不够复杂,无法导致死锁。您能否描述一下您认为自己陷入死锁的原因、收到的错误以及最重要的是您使用的 SQL 风格?