gpt4 book ai didi

sql - 同时执行更新时出现死锁

转载 作者:行者123 更新时间:2023-12-02 05:06:50 25 4
gpt4 key购买 nike

我正在对应用程序进行负载测试并遇到死锁错误。该场景是由 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());
}

最佳答案

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

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

我的钱在最后一个。

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


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

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

sbSql = string.Format(sbSql, id);

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

关于sql - 同时执行更新时出现死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10358383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com