MySQL事务中SQL事务的原子性如何?

时间:2014-02-02 20:40:46

标签: mysql sql transactions

我想知道 - 如果我有一个SQL事务,我在一个语句中执行select查询,然后在稍后的语句中执行更新查询,是否保证两者之间没有任何外部因素改变?< / p>

  • 所以我在交易中选择了多行⟵

  • 另一个程序会更改交易外的其中一行

  • 我想在事务

  • 中进行更新⟵

这可能会发生吗?我知道总事务要么发生了要么没有,但是1个事务中的所有单个语句也被执行为1个原子单元,在两个不同的语句之间什么都不会发生?或者是通过设置手动表锁来确保数据库在两个语句之间被锁定的唯一方法吗?

这个问题就是这样:我将钱从一个用户(买方)转移到另一个用户(卖方)。但是,买方在下订单时已存入款项。现在他可以随时取消此购买订单。然后我会把存款还给他。所以现在我可能会在将存款从买家转移到卖家的过程中发生,而买家取消订单,我就把钱还给他。所以现在把钱给买方,卖给卖方。这需要一些高级隔离吗?

1 个答案:

答案 0 :(得分:0)

这取决于事务隔离级别。 我曾经使用的所有数据库的默认隔离级别是Read Committed,此级别允许查看其他已提交事务所做的更改。  相比之下,串行或快照隔离级别将当前事务与其他事务隔离,但它不能像Read Committed那样扩展。 您可以在所有现代数据库上更改每个事务或全局的隔离级别,但我不建议在没有充分理由的情况下执行此操作,Read Committed对于典型用例来说是一个很好的隔离,因为它不需要锁定读取,串行隔离使用重锁定以使事务串行而不是并发,并且可能无法针对典型用例进行扩展。