gpt4 book ai didi

mysql - MySQL 中的 SQL 事务到底有多原子化?

转载 作者:行者123 更新时间:2023-11-30 23:06:51 25 4
gpt4 key购买 nike

我想知道——如果我有一个 SQL 事务,在一个语句中执行选择查询,然后在后面的语句中执行更新查询,是否可以保证两者之间没有任何外部因素改变?

  • 所以我在事务中选择了一些行 ⟵

  • 另一个过程在事务外更改其中一行 ⟵

  • 比我想在交易中做更新 ⟵

这会发生吗?我知道整个事务要么发生要么不发生,但是 1 个事务中的所有单独语句是否也作为 1 个原子单元执行,在两个不同的语句之间什么都不会发生?还是只能通过设置手动表锁来确保数据库在两条语句之间被锁定?

顺便说一句,这个问题是关于这个的:我把钱从一个用户(买家)转移到另一个用户(卖家)。但是,买家在下订单时已经存入了钱。现在他可以随时取消这个买单。然后我会把存入的钱还给他。所以现在可能会发生这样的情况,我正在将存入的钱从买家转移到卖家,而买家取消了他的订单,我把钱还给了他。所以现在钱给了买家,也给了卖家。这需要一些高级隔离,对吗?

最佳答案

这取决于事务隔离级别。我曾经使用过的所有数据库的默认隔离级别都是 Read Committed,这个级别允许查看其他已提交事务所做的更改。 相反,Serial 或 Snapshot 隔离级别将当前事务与其他事务隔离开来,但它的扩展性不如 Read Committed。您可以更改每个事务的隔离级别或在所有现代数据库上全局更改隔离级别,但我不建议在没有充分理由的情况下这样做,Read Committed 是典型用例的良好隔离,因为它不需要锁定读取,串行隔离使用大量锁定以使事务串行而不是并发,并且它可能无法针对典型用例进行扩展。

关于mysql - MySQL 中的 SQL 事务到底有多原子化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21515947/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com