因其他报错导致事务回滚的问题

一、问题现象

如果事务内报错,则导致事务自动回滚,事务内的修改不会生效,保证数据一致性。事务内报错的原因可能很多,比如语法错误、会话长时间未执行操作导致超时、操作不存在的表等等。

二、定位方法

事务内报错的原因可能很多,需要具体分析,一方面可以通过客户端返回的报错信息识别报错原因。另一方面可以查看pg_log目录下的数据库日志里是否存在报错信息识别报错原因。 下面是一个因在事务内查找不存在的表而报错的例子。 客户端输出如下:

1. tpccdb=# create table t1 (id int);
2. CREATE TABLE
3. tpccdb=# begin;
4. BEGIN
5. tpccdb=# select * from t2;
6. ERROR:  relation "t2" does not exist on node1
7. LINE 1: select * from t2;
8. ^
9. tpccdb=# select * from t1;
10. ERROR:  current transaction is aborted, commands ignored until end of transaction block, firstChar[Q]
11. tpccdb=# rollback;
12. ROLLBACK

对应时间段的pg_log报错如下:

1. 2024-10-08 11:27:32.498 zhoucong_dev tpccdb [local] 281426503981504 0[0:0#0]  0 [BACKEND] LOG:  statement: select * from t2;
2. 2024-10-08 11:27:32.509 zhoucong_dev tpccdb [local] 281426503981504 0[0:0#0]  281474976710792 [BACKEND] ERROR:  relation "t2" does not exist on node1 at character 15
3. 2024-10-08 11:27:32.509 zhoucong_dev tpccdb [local] 281426503981504 0[0:0#0]  281474976710792 [BACKEND] STATEMENT:  select * from t2;
4. 2024-10-08 11:27:32.509 zhoucong_dev tpccdb [local] 281426503981504 0[0:0#0]  281474976710792 [BACKEND] BACKTRACELOG:  tid[397046]'s backtrace:
5. /home/zhoucong_dev/work/openGauss-server-list/openGauss-server/dest/bin/gaussdb() [0x10b04bc]
6. /home/zhoucong_dev/work/openGauss-server-list/openGauss-server/dest/bin/gaussdb(_Z9errfinishiz+0x334) [0x10a4740]
7. /home/zhoucong_dev/work/openGauss-server-list/openGauss-server/dest/bin/gaussdb(_Z15parserOpenTableP10ParseStatePK8RangeVaribbb+0x5ec) [0xd0f0e0]
8. /home/zhoucong_dev/work/openGauss-server-list/openGauss-server/dest/bin/gaussdb(_Z18addRangeTableEntryP10ParseStateP8RangeVarP5Aliasbbbbb+0x180) [0xd0f52c]
9. /home/zhoucong_dev/work/openGauss-server-list/openGauss-server/dest/bin/gaussdb() [0xcc92b4]
10. /home/zhoucong_dev/work/openGauss-server-list/openGauss-server/dest/bin/gaussdb(_Z23transformFromClauseItemP10ParseStateP4NodePP13RangeTblEntryPiS5_S6_PP4Listbbbb+0xcc) [0xccb56c]
11. /home/zhoucong_dev/work/openGauss-server-list/openGauss-server/dest/bin/gaussdb(_Z19transformFromClauseP10ParseStateP4Listbbb+0xbc) [0xcc81bc]
12. /home/zhoucong_dev/work/openGauss-server-list/openGauss-server/dest/bin/gaussdb() [0xc325e4]
13. /home/zhoucong_dev/work/openGauss-server-list/openGauss-server/dest/bin/gaussdb(_Z13transformStmtP10ParseStateP4Nodebb+0x24c) [0xc2b784]
14. /home/zhoucong_dev/work/openGauss-server-list/openGauss-server/dest/bin/gaussdb(_Z21transformTopLevelStmtP10ParseStateP4Nodebb+0x224) [0xc2a700]
15. /home/zhoucong_dev/work/openGauss-server-list/openGauss-server/dest/bin/gaussdb(_Z13parse_analyzeP4NodePKcPjibbP10ParseState+0x184) [0xc29c44]
16. /home/zhoucong_dev/work/openGauss-server-list/openGauss-server/dest/bin/gaussdb(_Z22pg_analyze_and_rewriteP4NodePKcPjiP10ParseState+0x7c) [0x1999d68]
17. /home/zhoucong_dev/work/openGauss-server-list/openGauss-server/dest/bin/gaussdb() [0x199df74]
18. /home/zhoucong_dev/work/openGauss-server-list/openGauss-server/dest/bin/gaussdb(_Z12PostgresMainiPPcPKcS2_+0x44c4) [0x19b0264]
19. /home/zhoucong_dev/work/openGauss-server-list/openGauss-server/dest/bin/gaussdb() [0x18c96a8]
20. /home/zhoucong_dev/work/openGauss-server-list/openGauss-server/dest/bin/gaussdb(_Z17GaussDbThreadMainIL15knl_thread_role1EEiP14knl_thread_arg+0x704) [0x18de780]
21. /home/zhoucong_dev/work/openGauss-server-list/openGauss-server/dest/bin/gaussdb() [0x18d8ff0]
22. /home/zhoucong_dev/work/openGauss-server-list/openGauss-server/dest/bin/gaussdb() [0x2594230]
23. /lib64/libpthread.so.0(+0x88cc) [0xfffbe92988cc]
24. /lib64/libc.so.6(+0xd954c) [0xfffbe91d954c]
25. Use addr2line to get pretty function name and line

三、问题根因

事务内报错的原因可能很多,比如语法错误、会话长时间未执行操作导致超时、操作不存在的表等等。事务内报错的原因可能很多,需要具体分析,一方面可以通过客户端返回的报错信息识别报错原因,另一方面可以查看pg_log目录下的数据库日志里是否存在报错信息识别报错原因。

四、解决方案

如果事务内报错,则导致事务自动回滚,事务内的修改不会生效,保证数据一致性。