假设有两个事务:T1 和 T2。
BEGIN; -- Т1
UPDATE table
SET amount = 1
WHERE id = 1;
SELECT xmin, xmax FROM table
WHERE id = 1;
-- получаем: xmin = xid транзакции Т1, xmax = 0
让我们开始第二笔交易:
BEGIN; -- T2
UPDATE table
SET amount = 2
WHERE id = 1;
-- ожидание завершения транзакции Т1
我们完成第一笔交易:
COMMIT;
我们继续第二个:
SELECT xmin, xmax FROM table
WHERE id = 1;
-- получаем: xmin и xmax равный идентификатору (xid) транзакции Т2.
问题:为什么事务 T1 在更新后开始看到 xmax = 0,而事务 T2 在更新后开始看到 xmax = xid(T2)?我想强调的是,这些值相对于更新数据的事务是可见的。
PS 我之前不知何故没有注意到这一点,并且总是认为如果事务更改了一行,那么相对于其自身,它会在新行中看到 xmax = 0,因为这是一个新元组,而且还没有人更改它。