Skip to content

Postgres with array type field can not rollback in seata AT mode, json deserialize exception #7661

@beanww

Description

@beanww

Check Ahead

  • I have searched the issues of this repository and believe that this is not a duplicate.

  • I am willing to try to fix this bug myself.

Ⅰ. Issue Description

seata 2.1 client, seata 2.3 server

exception occurs when globaltransaction rollback:

2025-09-25 13:30:32.141 | �[34m INFO 29608�[0;39m | �[1;33mrpcDispatch_RMROLE_1_19_32 [TID: N/A]�[0;39m �[1;32morg.apache.seata.rm.AbstractRMHandler �[0;39m | Branch Rollbacked result: PhaseTwo_RollbackFailed_Retryable
2025-09-25 13:30:33.137 | �[34m INFO 29608�[0;39m | �[1;33mrpcDispatch_RMROLE_1_20_32 [TID: N/A]�[0;39m �[1;32mo.a.s.c.r.p.c.RmBranchRollbackProcessor �[0;39m | rm handle branch rollback process:BranchRollbackRequest{xid='xxxx:3261279418629289337', branchId=3261279418629289338, branchType=AT, resourceId='jdbc:postgresql://xxxxx', applicationData='null'}
2025-09-25 13:30:33.137 | �[34m INFO 29608�[0;39m | �[1;33mrpcDispatch_RMROLE_1_20_32 [TID: N/A]�[0;39m �[1;32morg.apache.seata.rm.AbstractRMHandler �[0;39m | Branch Rollbacking: xxxx:3261279418629289337 3261279418629289338 jdbc:postgresql://xxxx:5432/db_sys_dev
2025-09-25 13:30:33.139 | �[1;31mERROR 29608�[0;39m | �[1;33mrpcDispatch_RMROLE_1_20_32 [TID: N/A]�[0;39m �[1;32mo.a.s.r.d.u.parser.JacksonUndoLogParser �[0;39m | json decode exception, Cannot deserialize value of type java.lang.Long from Array value (token JsonToken.START_ARRAY)
at [Source: REDACTED (StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION disabled); line: 1, column: 1159] (through reference chain: org.apache.seata.rm.datasource.undo.BranchUndoLog["sqlUndoLogs"]->java.util.ArrayList[0]->org.apache.seata.rm.datasource.undo.SQLUndoLog["beforeImage"]->org.apache.seata.rm.datasource.sql.struct.TableRecords["rows"]->java.util.ArrayList[0]->org.apache.seata.rm.datasource.sql.struct.Row["fields"]->java.util.ArrayList[2]->org.apache.seata.rm.datasource.sql.struct.Field["value"]->org.apache.seata.rm.datasource.sql.serial.SerialArray["elements"]->java.lang.Object[][0])
com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize value of type java.lang.Long from Array value (token JsonToken.START_ARRAY)
at [Source: REDACTED (StreamReadFeature.INCLUDE_SOURCE_IN_LOCATION disabled); line: 1, column: 1159] (through reference chain: org.apache.seata.rm.datasource.undo.BranchUndoLog["sqlUndoLogs"]->java.util.ArrayList[0]->org.apache.seata.rm.datasource.undo.SQLUndoLog["beforeImage"]->org.apache.seata.rm.datasource.sql.struct.TableRecords["rows"]->java.util.ArrayList[0]->org.apache.seata.rm.datasource.sql.struct.Row["fields"]->java.util.ArrayList[2]->org.apache.seata.rm.datasource.sql.struct.Field["value"]->org.apache.seata.rm.datasource.sql.serial.SerialArray["elements"]->java.lang.Object[][0])
at com.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:59)
at com.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1767)
at com.fasterxml.jackson.databind.DeserializationContext.handleUnexpectedToken(DeserializationContext.java:1541)

undolog rollback info:

{"@Class":"org.apache.seata.rm.datasource.undo.BranchUndoLog","xid":"192.168.100.81:8091:3261279418629289337","branchId":3261279418629289338,"sqlUndoLogs":["java.util.ArrayList",[{"@Class":"org.apache.seata.rm.datasource.undo.SQLUndoLog","sqlType":"UPDATE","tableName":"system_users","beforeImage":{"@Class":"org.apache.seata.rm.datasource.sql.struct.TableRecords","tableName":"system_users","rows":["java.util.ArrayList",[{"@Class":"org.apache.seata.rm.datasource.sql.struct.Row","fields":["java.util.ArrayList",[{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"available_site_ids","keyType":"NULL","type":2003,"value":{"@Class":"org.apache.seata.rm.datasource.sql.serial.SerialArray","elements":["[Ljava.lang.Long;",[]],"baseType":-5,"baseTypeName":"int8","array":["[Ljava.lang.Long;",[]],"resultSet":null}},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"avatar","keyType":"NULL","type":12,"value":""},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"dept_ids","keyType":"NULL","type":2003,"value":{"@Class":"org.apache.seata.rm.datasource.sql.serial.SerialArray","elements":["[Ljava.lang.Long;",[["java.lang.Long",10]]],"baseType":-5,"baseTypeName":"int8","array":["[Ljava.lang.Long;",[10]],"resultSet":null}},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"email","keyType":"NULL","type":12,"value":""},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"id","keyType":"PRIMARY_KEY","type":-5,"value":["java.lang.Long",1956302537468411905]},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"mobile","keyType":"NULL","type":12,"value":""},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"nickname","keyType":"NULL","type":12,"value":"keithxxxxxxxxxxxx"},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"post_ids","keyType":"NULL","type":12,"value":"[1]"},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"purpose","keyType":"NULL","type":5,"value":1},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"remark","keyType":"NULL","type":12,"value":"123"},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"sex","keyType":"NULL","type":5,"value":0},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"status","keyType":"NULL","type":5,"value":0},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"update_time","keyType":"NULL","type":93,"value":["java.sql.Timestamp",1758766045000]},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"updater","keyType":"NULL","type":12,"value":"1"},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"user_type_id","keyType":"NULL","type":4,"value":2},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"username","keyType":"NULL","type":12,"value":"keithTestadmin"},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"valid_time","keyType":"NULL","type":93,"value":["java.sql.Timestamp",1755253777649]}]]}]]},"afterImage":{"@Class":"org.apache.seata.rm.datasource.sql.struct.TableRecords","tableName":"system_users","rows":["java.util.ArrayList",[{"@Class":"org.apache.seata.rm.datasource.sql.struct.Row","fields":["java.util.ArrayList",[{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"available_site_ids","keyType":"NULL","type":2003,"value":{"@Class":"org.apache.seata.rm.datasource.sql.serial.SerialArray","elements":["[Ljava.lang.Long;",[]],"baseType":-5,"baseTypeName":"int8","array":["[Ljava.lang.Long;",[]],"resultSet":null}},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"avatar","keyType":"NULL","type":12,"value":""},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"dept_ids","keyType":"NULL","type":2003,"value":{"@Class":"org.apache.seata.rm.datasource.sql.serial.SerialArray","elements":["[Ljava.lang.Long;",[["java.lang.Long",10]]],"baseType":-5,"baseTypeName":"int8","array":["[Ljava.lang.Long;",[10]],"resultSet":null}},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"email","keyType":"NULL","type":12,"value":""},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"id","keyType":"PRIMARY_KEY","type":-5,"value":["java.lang.Long",1956302537468411905]},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"mobile","keyType":"NULL","type":12,"value":""},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"nickname","keyType":"NULL","type":12,"value":"keithxxxxxxxxxxxx"},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"post_ids","keyType":"NULL","type":12,"value":"[1]"},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"purpose","keyType":"NULL","type":5,"value":1},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"remark","keyType":"NULL","type":12,"value":"1234"},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"sex","keyType":"NULL","type":5,"value":0},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"status","keyType":"NULL","type":5,"value":0},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"update_time","keyType":"NULL","type":93,"value":["java.sql.Timestamp",1758778122000]},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"updater","keyType":"NULL","type":12,"value":"1"},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"user_type_id","keyType":"NULL","type":4,"value":2},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"username","keyType":"NULL","type":12,"value":"keithTestadmin"},{"@Class":"org.apache.seata.rm.datasource.sql.struct.Field","name":"valid_time","keyType":"NULL","type":93,"value":["java.sql.Timestamp",1755253777649]}]]}]]}}]]}

Ⅱ. Describe what happened

globaltransaction service failed, and seata rollback exception

Ⅲ. Describe what you expected to happen

seata rollback success

Ⅳ. How to reproduce it (as minimally and precisely as possible)

postgres table with array type field, and when service failed trigger seata rollback, seata will throw json deser exception
CREATE TABLE public.system_users (
id bigserial NOT NULL,
username varchar(60) NOT NULL,
dept_ids _int8 NULL, <<-----this is an array type field
CONSTRAINT pk_system_users PRIMARY KEY (id)
);

Ⅴ. Anything else we need to know?

No response

Ⅵ. Environment

jdk 21
seata client 2.1
seata server 2.3
db: postgres 15
os: windows10

Metadata

Metadata

Assignees

Labels

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions