2014-10-20 55 views
0

在我的項目中,我使用Spring和mybatis,用mybatis-spring將它們粘合在一起。我在服務層周圍使用了Spring的聲明式@Transactional註釋,這些註釋調用了mybatis映射器。我該如何讓mybatis需要交易?

我寧願沒有一個活動的事務可以調用我的mapper方法的NONE。相反,他們悄無聲息地在無事務的環境中運行(否則他們正在開始一個新的事務)。

有沒有辦法禁用這種行爲,並使其行爲更像一個強制傳播級別?

回答

1

最簡單的方法是創建自定義TransactionFactory,它將檢查是否存在活動事務並以其他方式拋出異常。

class MandatoryTransactionSpringManagedTransactionFactory extends SpringManagedTransactionFactory { 
    public Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit) { 
     if (!TransactionSynchronizationManager.isActualTransactionActive()) { 
       throw new IllegalTransactionStateException(
       "No existing transaction found during mapper invocation"); 
     } 
     return super.newTransaction(dataSource); 

}}

它應該被用來配置org.mybatis.spring.SqlSessionFactoryBean

+0

謝謝!我知道有一個鉤子,我可以把一些邏輯,我只是​​無法找到它。偶然我還發現,用@Tranactional註釋我的映射器接口每個都有訣竅,但是您的解決方案確保我不會忘記這麼做。 – Ben 2014-10-31 18:27:50