与MyBatis和Spring的请求范围的事务

时间:2012-06-04 21:49:35

标签: java spring mybatis

有没有办法用SpringMVC设置MyBatis,为整个http请求设置一个事务?通常在MyBatis中有类似Hibernate OpenSessionInViewFilter的东西,还是应该编写自己的过滤器来实现这种行为?

4 个答案:

答案 0 :(得分:5)

你对观念和#34;会话"感到困惑和"交易"。 OSIV打开会话,在一个会话中,几个交易可以共存。通常,您应将@Transactional属性添加到控制器使用的服务中,具体取决于您的业务要求。

此外,一切大事都是反模式。理想情况下,对用户的操作进行读写事务,然后另一个只读事务是为用户构建响应。它节省了资源,因为插入/更新所采用的数据库锁定是先前发布的。

答案 1 :(得分:1)

您可以让Spring处理您的交易。

查看文档。我很容易 您只需要在需要它的方法中配置和添加@Transactional注释。

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

答案 2 :(得分:0)

我的建议是阅读以下帮助文档: http://static.springsource.org/spring/docs/3.0.5.RELEASE/reference/transaction.html

由于你没有完全控制spring-mvc框架的每个部分,我建议在spring-mvc的基类上使用aop切入点来启动事务(在每个请求上执行的方法。)你可以在10.5.2节中找到这种方法。 只要确保你切入的类是由spring otherwize初始化它就不会起作用。

答案 3 :(得分:0)

如果您确实需要将单个事务绑定到特定请求,则可以考虑在TransactionTemplate中使用Filter。我不认为你可以在@Transactional上使用Filter,除非它是由Spring管理的(例如: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));
    }
}