2010-10-27 69 views

回答

4

只是:

UPDATE tabl 
SET  col1 = col2, 
     col2 = col1 

没有DML查询看到它的结果,以避免Halloween problem

在内部,UPDATE锁被放置在记录(或数据页)上,旧的值被读取并存储到临时变量,那么锁升级为EXCLUSIVE和新值(存储在临时变量)是写入适当的专栏。

+0

整齐!我从来不知道你可以指望这... – 2010-10-27 10:08:00

+0

只是出于兴趣,你知道这是否工作,即使隔离级别设置为未读提交? – 2010-10-27 10:27:28

+0

@保罗:是的。尽管有'READ UNCOMMITED',DML查询仍然会放置锁。 – Quassnoi 2010-10-27 10:40:27

0

我的笔记信用乔·塞科:

<set clause list>每个任务并行执行和 每组第一次更改所有符合条件的行。或者至少是 这是理论模型。在实践中,实现将首先使用WHERE 子句在一次传递中标记表中的所有限定行。如果没有问题,那么SQL引擎会在工作存储中为每个标记行创建一个 的副本。每个SET子句在旧行图像上基于 执行,结果放入新行图像。 最后,删除旧行并插入新行。如果在所有这些过程中发生了一个 错误,则系统执行ROLLBACK,表 保持不变并报告错误。这种并行性不是 ,就像你在传统的第三代编程 语言中找到的一样,所以它可能很难学习。此功能可让你写一个 语句,将在两列交换价值,即:

UPDATE MyTable 
SET a = b, b = a; 

这是不一样的东西

BEGIN ATOMIC 
UPDATE MyTable 
SET a = b; 
UPDATE MyTable 
SET b = a; 
END; 

在第一次更新,列A和B交换每行中的值。在 第二对UPDATE中,列a将在每一行中获得列b的所有值 。在该对的第二个UPDATE中,a(现在为 与b的原始值具有相同的值)将被写回 列b - 完全不变。对于值表达式可以有什么限制。同一列在<set clause list>中不能出现超过一次 - 这是合理的,因为该语句的并行性 。既然两者都同时生效,你就不知道使用哪个SET子句。

相关问题