事务 ID 的分配会用尽或者翻转吗?
事务是数据库管理系统执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。在数据库运行过程中,每一个事务需要分配一个唯一的事务 ID。那么,事务 ID 的分配会出现用尽或者翻转的情况吗?
事务 ID 的分配不会出现用尽或者翻转的情况。
在 Redrock Postgres 中,事务 ID 类型xid
是由回滚段号、事务槽号、和序列号组成的,回滚段号和事务槽号都是 2 字节的长度,序列号是 4 字节的长度。一个回滚段支持的事务数取决于回滚段中的事务槽位数。回滚段的首个页面用于存储事务表项信息,单个回滚段同时最多能存放约 200 个事务项。另外,当事务项中的序列号发生溢出后,用于表示事务槽号的 2 字节字段,还可以存放序列号的溢出部分。
数据库实例初始化后,数据库中默认会产生 8 个数据库级别的回滚段。所以一个数据库默认可用的事务 ID 数目为: \(8 * 2^{16} * 2^{32}\),假设数据库每秒处理 100 万个事务,数据库事务 ID 的分配周期可以达到 71 年。
事务 ID 的可用时长已经接近于人类平均寿命。