【发布时间】:2014-02-26 06:22:18
【问题描述】:
我想知道——如果我有一个 SQL 事务,在一个语句中我执行选择查询,然后在后面的语句中执行更新查询,是否可以保证两者之间的外部因素没有任何改变?
所以我在事务中选择了一些行 ⟵
另一个过程更改事务之外的行 ⟵
比我想做的更新⟵在事务中
那么这会发生吗?我知道总事务要么发生,要么不发生,但是 1 个事务中的所有单个语句是否也作为 1 个原子单元执行,在两个不同的语句之间什么都不会发生?或者是通过设置手动表锁来确保数据库被锁定在两个语句之间的唯一方法?
顺便说一句,这个问题是关于这个的:我将钱从一个用户(买方)转移到另一个用户(卖方)。但是,买方在下订单时已经存入了资金。现在他可以随时取消这个买单。然后我会把存入的钱还给他。所以现在可能发生我正在将存款从买家转移到卖家的过程中,而买家取消了他的订单,我把他的钱还给了他。所以现在钱给了买方,也给了卖方。这需要一些高级别的隔离,对吧?
【问题讨论】:
-
酸中的
A有一个非常具体的含义。这与您使用它的方式不同。你的问题是关于隔离的。 -
哦,好吧。好吧,我对这些东西很陌生,所以请原谅:p 无论如何,你有什么想法可以作为这个问题的答案吗?
-
SQL 标准保证如果您在 SERIALIZABLE 隔离(默认)下运行,那么您的事务将不会看到任何其他事务的任何影响。如果您以较低的隔离级别运行,您将不再受到很好的保护。那么,第二个问题是“MySQL 在该领域对 SQL 标准的遵守情况如何?”这不是很清楚。例如,如果您使用 ISAM 存储,您可能无法获得与使用 InnoDB 一样好的保护。在这种详细程度,我听从比我更了解 MySQL 的人的意见。
标签: mysql sql transactions