如果之前已经讨论过这个问题,或者甚至足以在维基百科上对其进行概述,请提前道歉。我只是觉得问会更有效率!
无论如何,我想从理论上的角度来询问交易。特别是,假设我们有两个(或更多)用户在查看数据集,并且以下情况发生在指定的时间 ( tX
):
t0 User1 starts a transaction
t1 User2 starts a transaction
t2 User1 runs a DML operation on the dataset
t3 User2 runs a different DML on the same dataset
t4 User1's operation finishes and is committed
t5 User2 commits
我的问题是:DML 操作如何在彼此之间运行User1
并User2
相互交互?操作开始于t2
通过User1
对数据进行操作,因为它是在他们的事务开始时定义的(即 at t0
),并且同样适用于User2
的操作,所以没有交互?或者,如果说User1
在User2
的事务开始之后但在他们开始操作之前提交了他们的操作,那么User2
正在查看的数据是否会分别更新?此外,在发生任何冲突的情况下如何保持一致性?
对于所有一般情况,第二个事务将被阻塞,直到第一个事务提交或回滚。正如 Martin 指出的那样,您的隔离级别可能会影响这一点,但 ACID 合规性的全部意义在于将它们分开。