2013-11-04 41 views
0

我有一個自定義Item讀取器讀取另一個讀取器,它是一個JdbcCursorItemReader(它從數據庫中的Request表中讀取數據),構建一個特定大小的列表並返回一個項目列表。試圖在Spring批處理的ItemReader之後更新記錄;沒有被提交到數據庫

請求表具有一個ID,類型和狀態。

我想更新閱讀器讀取的ID的狀態,例如PROCESSING,所以我的應用程序可以顯示請求ID正在批處理中處理。同時在處理商品時,如果有任何商業異常,我想更新具有特定狀態的ID表。

我希望狀態更新部分處於單獨的事務中,以便如果正在讀取某個項目並正在處理該項目,則這些請求的狀態將顯示PROCESSING而不是REQUESTED。

我正在使用@Transactional(propagation = Propagation.REQUIRES_NE W)更新請求狀態的方法。

我使用Spring Batch的表和我的應用程序特定表單獨的數據源和事務管理器。

我使用JDBC模板更新狀態。

我爲我的應用程序數據源使用javax.sql.DataSource,爲我的應用程序事務管理器和HibernateJpaVendorAdapter使用JpaTransactionManager。

的數據庫是Oracle。

當我打開調試日誌時,我發現它掛起了主要事務,當讀取器正在調用更新狀態時使用了一個新的事務,它將被提交,然後恢復暫停的事務。但我沒有看到數據庫上的更改。事務日誌說已提交,但我沒有看到數據庫中的更改。一旦批次完成,我會看到數據庫中請求表的更改。我錯過了什麼嗎?

這裏是日誌: 15:40:26 [main] DEBUG o.s.t.a.AnnotationTransactionAttributeSource - Adding transactional method 'updateStatus' with attribute: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT; '' 15:40:48 [main] DEBUG o.s.o.j.JpaTransactionManager - Creating new transaction with name [null]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT 15:40:48 [main] DEBUG o.s.o.j.JpaTransactionManager - Opened new EntityManager [[email protected]] for JPA transaction 15:40:48 [main] DEBUG o.h.e.t.s.AbstractTransactionImpl - begin 15:40:48 [main] DEBUG o.h.e.j.i.LogicalConnectionImpl - Obtaining JDBC connection 15:40:48 [main] DEBUG o.h.e.j.i.LogicalConnectionImpl - Obtained JDBC connection 15:40:48 [main] DEBUG o.h.e.t.i.j.JdbcTransaction - initial autocommit status: true 15:40:48 [main] DEBUG o.h.e.t.i.j.JdbcTransaction - disabling autocommit 15:40:48 [main] DEBUG o.s.o.j.JpaTransactionManager - Exposing JPA transaction as JDBC transaction [org.springframewo[email protected]3a7b058e] 15:40:48 [main] INFO c.c.c.f.c.a.b.RequestReader - Reading... 15:40:48 [main] INFO c.c.c.f.c.a.b.SecuritiesReader - End of Input Data from request id ItemReader 15:40:48 [main] DEBUG o.s.o.j.JpaTransactionManager - Creating new transaction with name [*.updateStatus]: PROPAGATION_REQUIRES_NEW,ISOLATION_DEFAULT; '' 15:40:48 [main] DEBUG o.s.o.j.JpaTransactionManager - Opened new EntityManager [[email protected]] for JPA transaction 15:40:48 [main] DEBUG o.h.e.t.s.AbstractTransactionImpl - begin 15:40:48 [main] DEBUG o.h.e.j.i.LogicalConnectionImpl - Obtaining JDBC connection 15:40:48 [main] DEBUG o.h.e.j.i.LogicalConnectionImpl - Obtained JDBC connection 15:40:48 [main] DEBUG o.h.e.t.i.j.JdbcTransaction - initial autocommit status: true 15:40:48 [main] DEBUG o.h.e.t.i.j.JdbcTransaction - disabling autocommit 15:40:48 [main] DEBUG o.s.o.j.JpaTransactionManager - Exposing JPA transaction as JDBC transaction [org.springframewo[email protected]88f431d] 15:40:48 [main] INFO c.c.c.f.c.a.b.s.i.InstrumentIdentifierServiceImpl - Updating the status of Request Id's 15:40:48 [main] DEBUG org.hibernate.SQL - UPDATE REQUEST SET STATUS = ? , MESSAGE = ? WHERE ID = ? 15:40:48 [main] DEBUG o.s.o.j.JpaTransactionManager - Initiating transaction commit 15:40:48 [main] DEBUG o.s.o.j.JpaTransactionManager - Committing JPA transaction on EntityManager [[email protected]] 15:40:48 [main] DEBUG o.h.e.t.s.AbstractTransactionImpl - committing 15:40:48 [main] DEBUG o.h.e.t.i.j.JdbcTransaction - committed JDBC Connection 15:40:48 [main] DEBUG o.h.e.t.i.j.JdbcTransaction - re-enabling autocommit 15:40:48 [main] DEBUG o.s.o.j.JpaTransactionManager - Closing JPA EntityManager [[email protected]] after transaction 15:40:48 [main] DEBUG o.s.o.j.EntityManagerFactoryUtils - Closing JPA EntityManager 15:40:48 [main] DEBUG o.h.e.j.i.LogicalConnectionImpl - Releasing JDBC connection 15:40:48 [main] DEBUG o.h.e.j.i.LogicalConnectionImpl - Released JDBC connection 15:40:48 [main] DEBUG o.s.o.j.JpaTransactionManager - Resuming suspended transaction after completion of inner transaction

謝謝!

回答

1

通常這種情況下與ChunkListener處理。聽者的beforeChunk用於「標籤」的所有項目進行讀取,那麼聽者的afterChunk處理後續更新後的項目有奔處理。另一種方法是使用StepExecutionListener標記要在步驟中處理的所有項目。

關於正在發生的事情,聽起來好像您遇到了嵌套事務問題。由於你有一個外部事務,所以內部的事務在外部事務提交之前不會被應用。

相關問題