当前位置: 首页 > 面试题库 >

使用'IF EXISTS'UPDATE .. ELSE .. INSERT'的危险是什么?

司寇星海
2023-03-14
问题内容

此问题与偶尔获取SqlException:超时expired有关。实际上,我IF EXISTS... UPDATE .. ELSE .. INSERT在我的应用程序中使用率很高。但是用户Remus
Rusanu说您不应该使用此功能。为什么我不应该使用它以及它包括什么危险。所以,如果我有

IF EXISTS (SELECT * FROM Table1 WHERE Column1='SomeValue')
    UPDATE Table1 SET (...) WHERE Column1='SomeValue'
ELSE
    INSERT INTO Table1 VALUES (...)

如何重写此语句以使其起作用?


问题答案:

使用合并

您的SQL失败,因为2个并发的重叠调用和非常接近的调用都将在INSERT发生之前从EXISTS中获得“ false”。因此他们都尝试插入,但是当然失败了。



 类似资料:
  • 问题内容: 为什么这么危险? 为什么建议改为使用? 我知道已弃用。还有什么使它不安全的? 有什么地方可以使用方法吗?如果是这样,请举一个例子。 问题答案: 为什么Thread.stop()如此危险? 此处详细描述了这些问题:http : //download.oracle.com/javase/6/docs/technotes/guides/concurrency/threadPrimitiveD

  • 问题内容: 我试图理解在“流文档”中发现的警告。我已经习惯了使用forEach()作为通用迭代器。这导致我编写这种类型的代码: 这是一个简单的例子。我了解该代码违反了Oracle关于有状态lamda和副作用的警告。但是我不明白为什么这个警告存在。 运行此代码时,它似乎表现出预期的效果。那么,我如何打破这一点来说明为什么这是一个坏主意? 在某种程度上,我读到以下内容: 如果并行执行,则ArrayLi

  • 问题内容: GoogleJavaScript样式指南建议不要扩展。但是,我用它来在不存在的浏览器中使用它(以及类似方法)。 我知道一些问题,但不是哈希表。 扩展时可能会出现什么问题,使Google对此提出建议? 问题答案: 大多数人都错过了这一点。我认为,例如填充或填充标准功能,使其在较旧的浏览器中运行,是一个好主意。不要听那些讨厌的人。Mozilla甚至向您展示了如何在MDN上执行此操作。通常,

  • 问题内容: 据说Go的不是(请参见此处和此处)。我有兴趣找出在我忽略使用互斥锁/ etc保护访问地图的情况下可能发生的情况。 具体来说 ,是否会发生以下任何情况? 假设我有一个带有键,,…,的映射,当我要求(i!= j)时,并发问题会导致获取错误吗? 可以在应用程序中导致吗? 问题答案: 正如评论已经指出的那样,种族是不好的。与Java不同,Go具有非常弱的保证,因此, 即使不执行包含种族的代码

  • 问题内容: 如何禁用危险的 评估 功能?可以使用 ini_set 函数完成吗? 还有如何禁用以下功能?我们可以使用 ini_set 函数禁用它们吗? 评估 是坏人可用来开发事物的最危险功能之一。应该有一种无需使用 php.ini 文件就可以禁用它的机制。但应以编程方式完成。 好吧,伙计们,我正在寻找一个答案,建议他们禁用这些危险的可爱家伙,而无需进入 php.ini 文件;我的意思是如何在运行时或

  • 我使用Microsoft Access2007和IBM AS400 DB2 SQL v6r1服务器。最近,我开始扩展我的DB2经验,将一些更复杂的访问查询转换为Pass-Through类型。查询速度的提高是惊人的,但这是意料之中的,尤其是在较大的表中,有些表有20,000,000多行。 正如使用Access+DB2所预期的那样,我遇到了SQL0666错误。或者至少...我现在期待它,因为我经常遇到