千家信息网

POSTGRESQL RC事务处理与ORACLE MYSQL 的区别以及对PGFANS群里面的问题的实例分析

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,POSTGRESQL RC事务处理与ORACLE MYSQL 的区别以及对PGFANS群里面的问题的实例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的
千家信息网最后更新 2026年11月03日POSTGRESQL RC事务处理与ORACLE MYSQL 的区别以及对PGFANS群里面的问题的实例分析

POSTGRESQL RC事务处理与ORACLE MYSQL 的区别以及对PGFANS群里面的问题的实例分析,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

有一个同学在PGFANS 群里面提了一个问题,在他实验的某个操作中发现PG 和 ORACLE 使用同样的操作流程后,得到的结果不一致。所以下面准备验证并找到一些可以解释的原因。

测试库名test

测试表 test

测试数据

id age

1 20

2 22

3 24

首先我们要确认 PG 的隔离 RC的模式 ,另外我要排除一些不存在的问题

下面是整个的操作流程,由于截图需要截图好几个,不利于查看,所以将其变成文字,并序列化, 每行中有执行的顺序号 和 属于的SESSION

1 test=# begin; SESSION 1 #开始SESSION 1

BEGIN

2 test=# select xmin,xmax,cmin,cmax,* from test; SESSION 1

xmin | xmax | cmin | cmax | id | age

---------+------+------+------+----+-----

2027732 | 0 | 0 | 0 | 2 | 40

2027735 | 0 | 1 | 1 | 1 | 20

(2 rows)

#查看当前的每行的事务情况

3 test=# select txid_current_if_assigned(); SESSION 1

txid_current_if_assigned

--------------------------

(1 row)

# 当前并未生成事务号

4 test=# begin; SESSION 2 # 同时启动SESSION 2

BEGIN

test=# select * from test; SESSION 2

id | age

----+-----

2 | 40

1 | 20

(2 rows)

# SESSION 2 中查看到的数据

5 test=# select txid_current_if_assigned(); SESSION 2

txid_current_if_assigned

--------------------------

(1 row)

6 test=# select txid_current_if_assigned(); SESSION 2

txid_current_if_assigned

--------------------------

(1 row)

7 test=# delete from test where id =1 ; SESSION 1

DELETE 1

test=# select txid_current_if_assigned();

txid_current_if_assigned

--------------------------

2027737

(1 row)

#SESSION 1 删除了数据

8 test=# update test set age = 100 where id =1 ; SESSION 2 WAITING...................

UPDATE 0

test=# select txid_current_if_assigned();

txid_current_if_assigned

--------------------------

2027738

(1 row)

#SESSION 2 更新数据 处于等待状态

9 test=# select xmin,xmax,cmin,cmax,* from test; SESSION 1

xmin | xmax | cmin | cmax | id | age

---------+------+------+------+----+-----

2027732 | 0 | 0 | 0 | 2 | 40

(1 row)

10test=# select txid_current_if_assigned(); SESSION 1

txid_current_if_assigned

--------------------------

2027737

(1 row)

11 test=# select xmin,xmax,cmin,cmax,* from test; SESSION 2

xmin | xmax | cmin | cmax | id | age

---------+------+------+------+----+-----

2027732 | 0 | 0 | 0 | 2 | 40

2027737 | 0 | 1 | 1 | 1 | 20

(2 rows)

#SESSION 1 插入数据

12 test=# insert into test (id,age) values (1,20); SESSION 1

INSERT 0 1

test=# select txid_current_if_assigned();

txid_current_if_assigned

--------------------------

2027737

(1 row)

13 test=# select xmin,xmax,cmin,cmax,* from test; SESSION 1

xmin | xmax | cmin | cmax | id | age

---------+------+------+------+----+-----

2027732 | 0 | 0 | 0 | 2 | 40

2027737 | 0 | 1 | 1 | 1 | 20

(2 rows)

14 test=# commit; SESSION 1

COMMIT

#SESSION 1 COMMIT

15 test=# select xmin,xmax,cmin,cmax,* from test; SESSION 1

xmin | xmax | cmin | cmax | id | age

---------+------+------+------+----+-----

2027732 | 0 | 0 | 0 | 2 | 40

2027737 | 0 | 1 | 1 | 1 | 20

(2 rows)

16 test=# commit; SESSION 2

COMMIT

#SESSION 2 COMMIT

17 test=# select xmin,xmax,cmin,cmax,* from test; SESSION 2

xmin | xmax | cmin | cmax | id | age

---------+------+------+------+----+-----

2027732 | 0 | 0 | 0 | 2 | 40

2027737 | 0 | 1 | 1 | 1 | 20

(2 rows)

结果:SESSION 2 不会更新 SESSION 1中后插入的数据。

从上面的步骤中我们能看到或者领会到PG 的那些特性

  • 事务ID 是自增的

  • 每行数据会用(t_xmin, t_xmax)来标示自己的可用性

  • t_xmin 存储的是产生这个元组的事务ID,可能是insert或者update语句t_xmax 存储的是删除或者锁定这个元组的XID

  • 事务只能看见t_xmin比自己XID 小且没有被删除的元组

以上是官方文档中的提示,已经明确的说明了上述的问题,并且也给出了一些建议。

那我们的工作到底完成了没有,没有,我们提升PG 的隔离级别到 RR.

结果如下:

SESSION 1

SESSION 2

在将SESSION的级别提升后,结果就变化了,再次在SESSION 2中操作,直接报错。

最后的问题是,提出问题的同学反映ORACLE 与PG的在类似的环节情况下,反馈的情况不一。同时我这边也通过MYSQL 8 来将上述的操作同样做了,与那位同学反映的情况一样。

个人认为这并不是PG数据库本身的缺陷,这是一种数据库处理某种复杂情况和隔离级别对数据一致性的一种取舍。

如果遇到这样的情况如何操作,有如下建议

1 可以提高数据库的隔离级别到RR (如果你的数据库中有类似业务或操作)

2 在设计业务逻辑时,通过逻辑删除而不是物理删除来对业务表进行操作。

3 可以在操作时添加 selecr for update 类似这样的语句对于数据的可操作性进行一个确认。

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

数据 事务 问题 情况 数据库 级别 结果 隔离 业务 同学 测试 处理 一致 同时 建议 截图 流程 语句 逻辑 存储 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技互联网 山东特亿宝互联网科技有限公司 互联网科技工作委员会副主任毛军 互联网科技的发展 兼蜜互联网科技 互联网科技类展会 温州喔噻互联网科技有限公司 黑科技闪耀互联网之光 崇明区互联网教育科技售后服务 恒生互联网科技业指数调整周期 众安科技工业互联网合作 中国科技和美国互联网 北京互联网科技类企业分布 互联网科技博主张洲 恒生互联网科技趋势 瑞安市蟠桃会互联网科技有限公司 北京瑞云互联网科技有限公司 互联网科技企业文化 互联网科技快速发展优美句子 互联网 科技节活动 微视频大赛 互联网电商科技 北京互联网科技有限公司 互联网科技集团 美国互联网前沿科技 福州新华互联网科技学校 知乎 互联网科技人工智能实验室 35岁以上互联网科技行业 互联网科技品牌 科技互联网企业在行动 广州全民伙伴互联网科技有限公司
0