-1

ItemWriter で自動配線された既存の DAO を使用して、データベースに要素を挿入しています。

commit-interval = 5 に設定しました。

私の xml (読み取り) では、再起動機能をテストするために、5 番目の要素に無効なデータを入れました。

ここに私のItemWriterがあります:

@Component("transactionItemWriter")
public class TransactionInteracItemWriter implements   ItemStreamWriter<TransactionConciliationInterac> {
    private static final Logger log = Logger.getLogger(TransactionInteracItemWriter.class);
    @Autowired
    private ConciliationContext conciliationContext;
    @Autowired
    private ServiceTransactionConciliationInterac paiementService;
    private int transactionCount;

    /**
     * @see ItemWriter#write(java.util.List)
     */
    public void write(List<? extends TransactionConciliationInterac> data) throws Exception {

    int index = ++transactionCount - 1;


    while (index < data.size()) {
        TransactionConciliationInterac trx = data.get(index);
        paiementService.insertAndReturnKey(trx,conciliationContext.getIdSommaire().toString());
    index = ++transactionCount - 1;
    }
}

paiementService は、JDBCTemplate を使用して DB にデータを挿入する Spring Bean です。

私の設定:

        <batch:step id="traitementXmlIemtTransactionStep">
        <batch:tasklet transaction-manager="transactionManager" start-limit="10">
            <batch:chunk reader="IemtXmlTransactionReader" processor="IemtXmlTransactionConvertProcessor" writer="transactionItemWriter" commit-interval="5"/>
            <batch:transaction-attributes isolation="DEFAULT" propagation="REQUIRED"/>
            <batch:listeners>
                <batch:listener ref="transactionStepListener" />
            </batch:listeners>

        </batch:tasklet>
    </batch:step>

これを実行すると、例外 (DataIntegrityEx) が発生することがわかります。

<Rollback for RuntimeException: org.springframework.dao.DataIntegrityViolationException:   PreparedStatementCallback; SQL []; Data truncation: Data too long for column  'TRANSACTIONTYPE' at row 1; nested exception is com.mysql.jdbc.MysqlDataTruncation: Data  truncation: Data too long for column 'TRANSACTIONTYPE' at row 1>
2012-12-11 09:50:28,949 DEBUG [org.springframework.batch.repeat.support.RepeatTemplate]  - <Handling exception: org.springframework.dao.DataIntegrityViolationException, caused by:  org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL [];  Data truncation: Data too long for column 'TRANSACTIONTYPE' at row 1; nested exception is  com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'TRANSACTIONTYPE' at row 1>
2012-12-11 09:50:28,949 DEBUG [org.springframework.batch.repeat.support.RepeatTemplate] - <Handling fatal exception explicitly (rethrowing first of 1): org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL []; Data truncation: Data too long for column 'TRANSACTIONTYPE' at row 1; nested exception is com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'TRANSACTIONTYPE' at row 1>
2012-12-11 09:50:28,950 ERROR [org.springframework.batch.core.step.AbstractStep] -    <Encountered an error executing the step>
org.springframework.dao.DataIntegrityViolationException: PreparedStatementCallback; SQL []; Data truncation: Data too long for column 'TRANSACTIONTYPE' at row 1; nested exception is com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'TRANSACTIONTYPE' at row 1
at     org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:101)

ステップのステータスは次のようになります。

<Step execution complete: StepExecution: id=3, version=2, name=traitementXmlIemtTransactionStep, status=FAILED, exitStatus=FAILED, readCount=5, filterCount=0, writeCount=0 readSkipCount=0, writeSkipCount=0, processSkipCount=0, commitCount=0, rollbackCount=1>

これは問題ありません。5 つの要素を読み取り、0 が書き込まれ、1 つのロールバックが発生したことがわかります。

しかし、データベースを見ると、最初の 4 つの要素がコミットされていることがわかります!!!!

私が間違っていることを見つけるために助けが必要です!

よろしく

4

3 に答える 3

3

最後に私の問題を見つけました!!! 私は MySql を使用していましたが、デフォルトでは、トランザクションをサポートしない MyIsam エンジンを使用しています。

それをinnoDBに変更したところ、すべてがうまく機能するようになりました。

于 2012-12-11T17:37:05.333 に答える
1

私の推測では、それServiceTransactionConciliationInteracには独自のトランザクション処理があります。たとえば、へのすべての呼び出しpaiementService.insertAndReturnKey()はトランザクションに囲まれています。Spring Batch は、こ​​れらの内部トランザクションをロールバックできません。

于 2012-12-11T16:11:48.693 に答える
0

それをinnoDBに変更したところ、すべてがうまく機能するようになりました。

spring.jpa.database-platform: org.hibernate.dialect.MySQL5InnoDBDialect

于 2020-03-03T09:02:23.927 に答える