好的,我知道了问题所在。我花了很长时间才弄清楚这一点,与我的数据库配置无关,所以我想为遇到类似问题的人们提供帮助。
Spring文档指出以下内容:
<tx:annotation-driven/>仅在定义的相同应用程序上下文中在bean上查找@Transactional。这意味着,如果<tx:annotation- driven/>为DispatcherServlet 放入 WebApplicationContext,则仅在控制器而不是服务中检查@Transactional bean。有关更多信息,请参见第15.2节“ DispatcherServlet”。
我的原始帖子中没有发布的是我的Servlet定义,其中包含以下几行配置代码:
myServlet.xml
<context:annotation-config /> <context:component-scan base-package="com.myDomain.*" />
这会将所有带注释的Bean(包括控制器,服务和存储库)带入Servlet上下文而不是应用程序上下文。问题就在这里。当Spring寻找用@Transactional注释的bean(由于
<tx:annotation-driven/>config.xml文件中存在)时,它将在应用程序上下文中寻找它们。而且,根据我在上一个线程中发布的配置,没有将任何bean加载到我的应用程序上下文中……它们都在servlet上下文中。因此,当我的servlet调用以@Service&@Transactional 注释的 bean时, 它 使用的是未由事务代理包装的bean。因此,没有交易。诀窍(而是正确的方法)是通过以下方式更改我的配置文件:
myServlet.xml
<context:annotation-config /> <context:component-scan base-package="com.myDomain.servlets" />
config.xml
<context:annotation-config /> <context:component-scan base-package="com.myDomain.dao" /> <context:component-scan base-package="com.myDomain.services" />
此配置确保所有Controller都存在于servlet上下文中,而Transactional Services和Repository存在于 _它们所属_的应用程序上下文中。最后,经过许多不眠之夜,我的数据库写操作仍在继续。



