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



有没有办法用SpringMVC设置MyBatis,以便为整个http请求进行一次交易?一般来说,MyBatis 中是否有类似 Hibernate OpenSessionInViewFilter 的东西,或者我应该编写自己的过滤器来实现这种行为?

您对"会话"和"事务"的概念感到困惑。OSIV打开会话,在一个会话中多个事务可以共存。通常,应根据业务需求,将@Transactional属性放入控制器使用的服务。

此外,所有事情的一个大交易是反模式。理想情况下,为用户的操作提供一个读写事务,然后另一个只读事务为用户构建响应。它可以节省资源,因为用于插入/更新的数据库锁会更早释放。

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

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

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

如果您确实需要将单个事务绑定到特定请求,则可以考虑在Filter中使用TransactionTemplate。我不认为你可以在Filter上使用@Transactional,除非它是由Spring管理的(例如:像Spring Security的过滤器这样的FilterChain的一部分。

以下是您可以使用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));
    }
}

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

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

最新更新