diff --git a/internal/eventstore/handler/v2/handler.go b/internal/eventstore/handler/v2/handler.go index 3c457aee28..93709015ef 100644 --- a/internal/eventstore/handler/v2/handler.go +++ b/internal/eventstore/handler/v2/handler.go @@ -331,7 +331,7 @@ func (h *Handler) processEvents(ctx context.Context, config *triggerConfig) (add return false, err } defer func() { - if err != nil { + if err != nil && !errors.Is(err, &executionError{}) { rollbackErr := tx.Rollback() h.log().OnError(rollbackErr).Debug("unable to rollback tx") return @@ -472,7 +472,7 @@ func (h *Handler) executeStatement(ctx context.Context, tx *sql.Tx, currentState return nil } - return err + return &executionError{parent: err} } return nil diff --git a/internal/eventstore/handler/v2/statement.go b/internal/eventstore/handler/v2/statement.go index 0816d5b451..5d2665019f 100644 --- a/internal/eventstore/handler/v2/statement.go +++ b/internal/eventstore/handler/v2/statement.go @@ -4,6 +4,7 @@ import ( "database/sql" "encoding/json" "errors" + "fmt" "strconv" "strings" "time" @@ -15,6 +16,26 @@ import ( "github.com/zitadel/zitadel/internal/zerrors" ) +var _ error = (*executionError)(nil) + +type executionError struct { + parent error +} + +// Error implements error. +func (s *executionError) Error() string { + return fmt.Sprintf("statement failed: %v", s.parent) +} + +func (s *executionError) Is(err error) bool { + _, ok := err.(*executionError) + return ok +} + +func (s *executionError) Unwrap() error { + return s.parent +} + func (h *Handler) eventsToStatements(tx *sql.Tx, events []eventstore.Event, currentState *state) (statements []*Statement, err error) { statements = make([]*Statement, 0, len(events))