apache/seatunnel · warning

Rollback statements cannot be handled without binlog…

Error message

Rollback statements cannot be handled without binlog buffering, the connector will fail. Please check '{}' to see how to enable buffering

What it means

A ROLLBACK statement appeared in the binlog as a QUERY event. Without binlog buffering enabled, Debezium cannot correctly process rollback semantics and warns that the connector will eventually fail if this keeps occurring. The warning points to the binlog.buffer.size config that enables buffering to handle it.

Solutions

  1. Enable binlog buffering by setting mysql connector 'database.binlog.buffer.size' (MySqlConnectorConfig.BUFFER_SIZE_FOR_BINLOG_READER) to a positive value
  2. Switch the source to binlog_format=ROW, which does not log ROLLBACK statements, and re-snapshot
  3. Identify the client issuing explicit ROLLBACK in binlogs (mysqlbinlog review) and refactor its transaction handling
  4. If failures follow the warning, restart streaming from a position before the ROLLBACK with buffering enabled

Example fix

// before
// no buffer configured
// after
"database.binlog.buffer.size": 20480
Defensive patterns

Strategy: validation

Validate before calling

// Enable buffering support before starting the connector:
// config['database.binlog.buffer.size'] = 20480  // > 0
// and verify binlog_format=ROW on the source

Prevention

When it happens

Trigger: handleQueryEvent receives sql equal (case-insensitive) to 'ROLLBACK' while the buffered binlog reader is not enabled (MySqlConnectorConfig.BUFFER_SIZE_FOR_BINLOG_READER unset/zero), typically under binlog_format=STATEMENT or MIXED where explicit transaction statements are logged.

Common situations: Statement-based replication sources where applications issue explicit ROLLBACK; MIXED-format binlogs from legacy databases; connectors streaming through transaction-control statements issued by migration tools.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


AI-assisted analysis of apache/seatunnel@cf67b549a7 (2026-09-10). Data as JSON: /api/errors/7b49e218f2c56e40. Report an issue: GitHub.

Appendix: source

Thrown at seatunnel-connectors-v2/connector-cdc/connector-cdc-mysql/src/main/java/io/debezium/connector/mysql/MySqlStreamingChangeEventSource.java:658

            // This is an XA transaction, and we currently ignore these and do nothing ...
            return;
        }
        if (connectorConfig.getDdlFilter().test(sql)) {
            LOGGER.debug("DDL '{}' was filtered out of processing", sql);
            return;
        }
        if (upperCasedStatementBegin.equals("INSERT ")
                || upperCasedStatementBegin.equals("UPDATE ")
                || upperCasedStatementBegin.equals("DELETE ")) {
            LOGGER.warn(
                    "Received DML '"
                            + sql
                            + "' for processing, binlog probably contains events generated with statement or mixed based replication format");
            return;
        }
        if (sql.equalsIgnoreCase("ROLLBACK")) {
            // We have hit a ROLLBACK which is not supported
            LOGGER.warn(
                    "Rollback statements cannot be handled without binlog buffering, the connector will fail. Please check '{}' to see how to enable buffering",
                    MySqlConnectorConfig.BUFFER_SIZE_FOR_BINLOG_READER.name());
        }

        final List<SchemaChangeEvent> schemaChangeEvents =
                taskContext
                        .getSchema()
                        .parseStreamingDdl(
                                partition,
                                sql,
                                command.getDatabase(),
                                offsetContext,
                                clock.currentTimeAsInstant());
        try {
            for (SchemaChangeEvent schemaChangeEvent : schemaChangeEvents) {
                if (taskContext.getSchema().skipSchemaChangeEvent(schemaChangeEvent)) {
                    continue;
                }

View on GitHub (pinned to cf67b549a7)