我正在尝试TransactionManager
在我的 Web 应用程序(由 Spring MVC 3 提供支持)中设置一个,因为我需要将一个组件的方法注释为@Transactional
.
这是我的情况:
web.xml
ContextLoaderListener
: 为 Spring (applicationContext.xml
和database.xml
)加载 2 个 xml 文件- applicationContext.xml:包含一些我无法通过注释定义的bean,加上注释的标签,加上通常的 context:annotation-config 和 context:component-scan (这个组件扫描包括包含该
@Transactional
方法的包) database.xml
: 包含数据源(我BasicDataSource
从 commons-dbcp 使用)、事务管理器定义和 tx:annotation-driven。
我有一个@Component
(DeleteComponent
),它有一个接口和一个实现 ( DeleteComponentImpl
)。实现类被注释@Component
并有一个公共方法被注释@Transactional
(我注释了具体类而不是接口,如 Spring 文档所述)。因为@Transactional
我没有提出任何论据,因为默认值很好。这个类有一些@Repository
通过@Autowired
. 我只使用普通的 JDBC(没有 Hibernate 或其他 ORM)。这@Component
被注入到@Controller
(在 spring- 中定义servlet.xml
)中。
但是,如果注释为 as 的方法@Transactional
抛出异常(未选中, as RuntimeException
),则不会回滚任何内容。数据库保留异常之前所做的更改。我正在使用 Jetty Web 服务器在本地测试我的应用程序。我注意到的事情实际上似乎没有设置事务管理器。实际上,我的事务管理器名为transactionManager
. 设置注释驱动事务的 xml 行是
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
如果我将其更改为使用不存在的 bean 名称,例如
<tx:annotation-driven transaction-manager="fake"/>
该应用程序仍然正确部署并且没有抱怨。
关于我应该检查什么以使其正常工作的任何提示?
谢谢。