2012-06-04 63 views

回答

4

你被概念 「會話」 和 「交易」 相混淆。 OSIV打開會話,在一個會話中可能會有多個事務共存。通常,您應該將@Transactional屬性應用於控制器使用的服務,具體取決於您的業務需求。

此外,一切的一大交易是反模式。理想情況是爲用戶的操作擁有讀寫事務,然後另一個只讀事務是爲用戶構建響應。它節省了資源,因爲用於插入/更新的數據庫鎖定會在早些時候發佈。

1

您可以讓Spring處理您的交易。

看看文檔。我很容易。 您只需要在需要它的方法中配置和添加@Transactional註釋。

http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/transaction.html

+0

是的,它是做什麼真的,但我的問題是,如果有可能使用MyBatis來處理整個請求,例如帶有Hibernate的'org.springframework.orm.hibernate3.support.OpenSessionInViewFilter',它將會話綁定到整個請求處理的線程。你根本不需要添加@Transactional註解 –

+1

你可以創建一個Spring託管的servlet過濾器,並且註釋用@Transactional做doFilter方法。 – Mikhas

+0

當然,這是我的答案,如果有MyBatis爲此做出的解決方案,或者如果我應該寫我自己的過濾器...我不想重新發明輪子,如果我不必;-) –

0

如果您確實需要將單個交易綁定到特定請求,則可以考慮在您的Filter中使用TransactionTemplate。我不認爲你可以在Filter使用@Transactional,除非如果它是由彈簧(如管理:的FilterChain就像Spring Security的過濾器部分

這裏是你可以用TransactionTemplate

public class TransactionalFilter implements Filter { 
    private TransactionTemplate transactionTemplate; 

    public void destroy() { 
    } 

    public void doFilter(final ServletRequest req, final ServletResponse resp, final FilterChain chain) throws ServletException, IOException { 

     transactionTemplate.execute(new TransactionCallback<Object>() { 
      @Override 
      public Object doInTransaction(TransactionStatus status) { 
       try { 
        chain.doFilter(req, resp); 
       } catch (IOException e) { 
        e.printStackTrace(); 
       } catch (ServletException e) { 
        e.printStackTrace(); 
       } 
       return null; 
      } 
     }); 
    } 

    public void init(FilterConfig config) throws ServletException { 
     transactionTemplate = new TransactionTemplate(WebApplicationContextUtils.getRequiredWebApplicationContext(config.getServletContext()).getBean(PlatformTransactionManager.class)); 
    } 
}