mysql 基于innodb引擎下的可重复读隔离级别介绍事务的可见性规则
read view的介绍以及创建时机
* 事务在开始时创建一个read view,后续需要复用read view
* read view 成员变量的介绍
* m_ids : 正在活跃的trx_id 列表
* min_ids : 最小的trx_id
* max_ids: 最大的trx_id,将要创建的trx_id
* creator_ids : 当前创建的trx_id -- 当前执行的事务所占用的trx_id
结合对应的数据行的三个隐藏字段
* rowid,trx_id,roll_pointer
* rowid:数据行存储的信息保存的地方 构成: pageid + pageoffset
* trx_id: 数据行被最新事务操作的事务id, 其他访问事务能否看到此数据的重要保证,同时也监控trx_id对应事务的状态信息
* roll_pointer: 多版本的指针,指向undo数据的版本信息,可以理解为一个多版本链。
postgresql 可重复读隔离级别的可见性规则
postgresql是基于创建对应的snanshot,也是在事务执行开始创建一个snapshot(version),后续不在创键
* 通过对应的sql语句查询 select pg_current_snapshot();
* 上述查询语句获取的结果的介绍
* xmin:快照中最早的事务ID,表示在这个事务ID之后(包括这个ID)开始的事务所做的更改对当前事务可见。
* xmax:快照中最晚的事务ID,表示在这个事务ID之前开始的事务所做的更改对当前事务可见。任何在这个ID之后开始的事务所做的更改对当前事务是不可见的。
* xip:活跃的事务ID列表,这些事务在快照被取得时是活跃的,它们所做的更改在当前事务中不可见。
* 例如,执行SELECT pg_current_snapshot();可能会返回如下结果:
xmin | xmax | xip
--------+---------+-----------
123456 | 123459 | {123457,123458}
这意味着:
事务ID为123456及之后开始的事务所做的更改对当前事务可见。
事务ID在123459及之前开始的事务所做的更改对当前事务可见。
事务ID为123457和123458的事务在当前快照被取得时是活跃的,它们所做的更改对当前事务是不可见的。
pg_current_snapshot()
提供的信息对于开发者和数据库管理员在处理并发控制和理解事务隔离级别的行为时非常有帮助。通过这些信息,可以更好地理解不同事务之间的数据可见性和潜在的数据冲突。