假设我有一个表(Table1),其Value字段的值为0。
然后两个用户(USER1和USER2)同时运行以下事务
BEGIN
UPDATE Table1 SET Value=Value+1;
UPDATE Table1 SET StatusField='Y' WHERE Value=2;
COMMIT;
如果命令按以下顺序执行
USER1启动交易
USER2启动交易
USER1结束交易;
USER2结束交易;
状态字段是否设置为Y?
NB!这不是一个真实的例子,您可能永远不会想要使用这样的代码,但我只是想了解事务的工作原理。换句话说,我想知道的是,如果两个交易同时开始并且其中一个交易完成,那么交易已经开始了解第一笔交易所做的更改吗?
答案 0 :(得分:3)
这取决于所选的隔离级别。
一旦默认隔离级别为Read Committed
并且您尚未更改它 - 答案是"是的,它将在其他交易中显示"。
在搜索目标行方面,
UPDATE
,DELETE
,SELECT FOR UPDATE
和SELECT FOR SHARE
命令与SELECT
的行为相同:它们只会找到目标从命令开始时间开始提交的行。但是,这样的目标行可能已经被另一个并发事务更新(或删除或锁定)。在这种情况下,可能的更新程序将等待第一个更新事务提交或回滚(如果它仍在进行中)。如果第一个更新程序回滚,则其效果被否定,第二个更新程序可以继续更新最初找到的行。
其他隔离级别行为:
Read uncommitted
表现相同; Repeatable read
和Serializable
将失败(如果第一个交易成功提交)。