# faultTolerant().skip(DataIntegrityViolationException.class): one bad row, job still COMPLETES

$ java -jar target/spring-batch-1.0.0.jar --spring.profiles.active=skip \
    --import.file=file:scenario-data/skip-demo/input.csv \
    --spring.datasource.url=jdbc:h2:file:.../scenario-data/skip-demo/db

2026-09-13T06:23:17.111Z  INFO 5469 --- [           main] o.s.batch.core.step.AbstractStep         : Executing step: [importStep]
2026-09-13T06:23:17.139Z  WARN 5469 --- [           main] c.a.b.p.ProductValidatingProcessor       : filtering abc-0012: does not match ^[A-Z]{3}-\d{4}$
2026-09-13T06:23:17.150Z  WARN 5469 --- [           main] c.a.b.p.ProductValidatingProcessor       : filtering ABC-0033: priceCents must be positive, was 0
Caused by: org.springframework.dao.DuplicateKeyException: PreparedStatementCallback; SQL [INSERT INTO PRODUCT (sku, name, price_cents) VALUES (?, ?, ?)]; Unique index or primary key violation: "PUBLIC.CONSTRAINT_18 INDEX PUBLIC.CONSTRAINT_INDEX_1 ON PUBLIC.PRODUCT(SKU NULLS FIRST) VALUES ( /* 5 */ 'ABC-0005' )"; SQL statement:
Caused by: org.springframework.dao.DuplicateKeyException: PreparedStatementCallback; SQL [INSERT INTO PRODUCT (sku, name, price_cents) VALUES (?, ?, ?)]; Unique index or primary key violation: "PUBLIC.CONSTRAINT_18 INDEX PUBLIC.CONSTRAINT_INDEX_1 ON PUBLIC.PRODUCT(SKU NULLS FIRST) VALUES ( /* 5 */ 'ABC-0005' )"; SQL statement:
SKIPPED on write: ABC-0005 (DuplicateKeyException: PreparedStatementCallback; SQL [INSERT INTO PRODUCT (sku, name, price_cents) VALUES (?, ?, ?)]; Unique index or primary key violation: "PUBLIC.CONSTRAINT_18 INDEX PUBLIC.CONSTRAINT_INDEX_1 ON PUBLIC.PRODUCT(SKU NULLS FIRST) VALUES ( /* 5 */ 'ABC-0005' )"; SQL statement:
2026-09-13T06:23:17.235Z  INFO 5469 --- [           main] o.s.batch.core.step.AbstractStep         : Step: [importStep] executed in 124ms
2026-09-13T06:23:17.247Z  INFO 5469 --- [           main] o.s.batch.core.step.AbstractStep         : Executing step: [reportStep]
REPORT: 57 products now in the PRODUCT table
2026-09-13T06:23:17.256Z  INFO 5469 --- [           main] o.s.batch.core.step.AbstractStep         : Step: [reportStep] executed in 9ms
JOB FINISHED: status=COMPLETED exitCode=COMPLETED

$ SELECT status, read_count, filter_count, write_count, write_skip_count, commit_count, rollback_count FROM BATCH_STEP_EXECUTION;
STATUS    | READ_COUNT | FILTER_COUNT | WRITE_COUNT | WRITE_SKIP_COUNT | COMMIT_COUNT | ROLLBACK_COUNT
COMPLETED | 60         | 2            | 57          | 1                | 6            | 2
(1 row, 22 ms)

$ SELECT COUNT(*) FROM PRODUCT;
COUNT(*)
57
(1 row, 19 ms)
