可视性检查中,根据t_xmin的三种状态,aborted,in_process 和 committed 来分情况讨论。
如果是aborted的,那么t_xmin 的状态一定是不可见的(invisible)
如果是in_process,大多数情况也是不可见的(invisible)。
只有一种情况是例外的,t_xmin的状态是in_process, t_xmin = current_txid,并且t_max 是invalid。即,当前的tuple正被当前的事务insert,并且这份tuple从未被删除或者更改过。那么此时它的状态是可见的(visible)
如果是committed,那么大多数情况下是可见的(visible),但也有三种状态是不可见的,
1.虽然t_xmin的状态是 commited, 但是,t_xmin的快照仍然是active的,那么t_xmin应当被视作in_process。
2.t_xmax= 当前的txid, 这代表这份tuple已经被当前事务删除或修改,所以也应当是不可见的(invisible)。
- t_xmin 是committed,t_xmax 也是committed。但是t_xmax的快照并不是active的。这代表这份tuple正在被另一个事务进行删除或修改操作。所以也应当是不可见的(invisible)。
reference:https://www.interdb.jp/pg/pgsql05/06.html