工会查询是否作为一项交易?

时间:2015-01-13 11:31:59

标签: mysql sql transactions union

假设我有这样的疑问:

SELECT id1 AS id, SUM(`value`), 'in' AS `type` FROM transaction WHERE id1 = 3434
UNION
SELECT id2 AS id, SUM(`value`), 'out' AS `type` FROM transaction WHERE id2 = 4568

查询#2是否看到与查询#1启动时相同的数据?

1 个答案:

答案 0 :(得分:0)

首先,您的示例是单个查询,而不是两个查询。如上所述,查询将扫描源数据两次,但它仍然是一个查询。

您正在寻找的属性是"隔离" ACID的财产。您可以详细了解ACID here和MySQL的支持here

大多数数据库(包括MySQL)都符合ACID,并且具有正确的配置参数。但是,这由各种参数控制,特别是单个交易的隔离级别。因为完全ACID合规性可能需要很多开销(例如,一旦在同一个表上开始UPDATE查询就阻止SELECT运行),有时会放松一些条件。 / p>

ACID合规性取决于特定配置和存储引擎的参数。但是,如果需要,MySQL可以而且确实支持隔离。

另请注意,UNION与隔离几乎没有关系,只是它需要扫描两次数据,这会使缺乏隔离更加明显。