我遇到了这个更新声明,并想知道内部工作是如何进行的。它更新了一个也在更新的where子句中使用的列。
理想情况下,这应该分两步完成,还是oracle会自动处理它?</ p>
UPDATE TBL1 SET DATE1=DATE2 WHERE DATE2> DATE1
答案 0 :(得分:2)
Oracle会自动处理它。有效地,当它运行更新时,Oracle执行以下步骤:
查询表 - 即评估表中每行的WHERE子句谓词
对于步骤1返回的每一行,按照SET子句更新它。每列的值是提取的值。
出于这个原因,完全可以运行这样的更新来交换列的值:
public function logout(){
$this->load->library('HybridAuthLib');
$service = $this->hybridauthlib->logoutAllProviders();
}
如果另一个会话尝试更新或删除其中一个相同的行,则可能会阻止更新。死锁是可能的,但Oracle会通过回滚其中一个会话并引发异常来自动解决这些问题。