2013-06-13 28 views
5

Tôi đang sử dụng giao dịch dựa trên chú thích trong dự án Spring MVC 3.1 và giao dịch của tôi không được khôi phục khi ngoại lệ được ném.Giao dịch mùa xuân không quay trở lại ngoại lệ (nguồn dữ liệu Oracle JNDI)

Đây là mã dịch vụ của tôi


@Service 
public class ImportService { 

    @Autowired 
    ImportMapper importMapper; 

    @Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.READ_COMMITTED, rollbackFor=Throwable.class) 
    public void processImport() throws ServiceException, DatabaseException { 
     iImport import = new Import(); 

     createImport(import); 

     throw new ServiceException("");   
    } 

    @Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.READ_COMMITTED, rollbackFor=Throwable.class) 
    private void createImport(Import import) throws DatabaseException { 
     try { 
      importMapper.createImport(eventImport); 
     } catch (Exception e) { 
      throw new DatabaseException(e); 
     } 
    } 

Vì vậy, hy vọng, phương pháp createImport nên được cuộn lại sau khi ngoại lệ được ném. Nhưng tiếc là nó không phải.

Tôi xác định nguồn dữ liệu của tôi trong context.xml máy chủ

<Resource name="datasource.import" auth="Container" type="javax.sql.DataSource" 
      maxActive="100" maxIdle="30" maxWait="10000" 
      username="user" password="password" driverClassName="oracle.jdbc.driver.OracleDriver" 
      url="jdbc:oracle:thin:@INFO" /> 

Và tôi đang tìm nó lên với JNDI:

<jee:jndi-lookup id="dataSource" jndi-name="datasource.import"/> 

<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 
    <property name="dataSource" ref="dataSource" /> 
</bean> 

<tx:annotation-driven /> 

Tôi đang sử dụng một cơ sở dữ liệu Oracle, và JDBC spec nói rằng cam kết tự động là đúng theo mặc định. Tôi nghĩ rằng nếu tôi đặt nó thành sai một cách rõ ràng sẽ giúp ích, nhưng tôi không thể tìm ra cách để làm điều đó.

Có cách nào để khôi phục hoạt động, trong khi tra cứu nguồn dữ liệu Oracle của bạn bằng JNDI.

+1

Tôi đã giải quyết được vấn đề của mình, nhưng vấn đề không phải là điều tôi nghĩ ban đầu. Các bean giao dịch được định nghĩa trong tệp ngữ cảnh sai. Tôi đã có chúng trong bối cảnh gốc. Câu hỏi này đã giúp tôi giải quyết vấn đề của mình: http://stackoverflow.com/questions/10538345/spring-transactional-annotations-ignored –

+0

Câu hỏi này dường như không có chủ đề vì vấn đề thực tế không phải là vấn đề được mô tả trong văn bản . – APC

Trả lời

5

Xin lưu ý rằng các giao dịch quay lại quản lý giao dịch của Spring chỉ cho các ngoại lệ không được kiểm soát (RuntimeException) theo mặc định. Nếu bạn muốn thực hiện khôi phục cũng trên các ngoại lệ đã kiểm tra, bạn cần xác định điều đó.

When using annotations as attribute source, bạn cần cung cấp rollbackFor thuộc tính với danh sách các lớp ngoại lệ, mà nên gây ra một giao dịch được cuộn lại (trích dẫn từ javadoc):

/** 
* Defines zero (0) or more exception {@link Class classes}, which must be a 
* subclass of {@link Throwable}, indicating which exception types must cause 
* a transaction rollback. 
* <p>This is the preferred way to construct a rollback rule, matching the 
* exception class and subclasses. 
* <p>Similar to {@link org.springframework.transaction.interceptor.RollbackRuleAttribute#RollbackRuleAttribute(Class clazz)} 
*/ 
Class<? extends Throwable>[] rollbackFor() default {}; 
+0

Nó được xác định. Chú thích Giao dịch có rollbackFor = Throwable.class –

0

Người ta nói rằng, nếu một phương thức @transational được gọi bằng phương thức @transational khác, phương thức đầu tiên sẽ không hoạt động. Bạn có thể thử xóa @transational đầu tiên và thử.