上周,我终于抽出时间让我的应用程序使用事务。我正在使用Spring声明式事务,我知道事务本身是有效的,因为它使一个事务中数千次插入的时间从5-10分钟缩短到5-10秒。数据库是MySQL,所有的表都是InnoDB。所以我想让这个函数在不起作用的时候回滚。基本上,它是导入一个xml文件并从xml构建数据库表。因此,如果某些东西失败了,我不想要部分上传,否则它将不一致。我一直在严格遵循Spring文档,因为我确实让事务运行了,所以我猜一般的配置是正确的。
以下是.xml文件的相关部分:
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true"/>
<tx:method name="uploadModelToProject" rollback-for="Throwable"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>以下是服务的相关部分:
public interface ModelService {
// interface to upload an LSI XML file of the model into a project
public Model uploadModelToProject(Project proj, String xmlFile);
}uploadModelToProject调用SAX Parser实现中的方法,然后由SAX Parser实现实现解析
public Model importModelToProject(Project proj, String xmlInputFileName) throws SAXException, IOException, ParserConfigurationException, ImportException {
//get a factory
SAXParserFactory spf = SAXParserFactory.newInstance();
try {
//get a new instance of parser
SAXParser sp = spf.newSAXParser();
//parse the file and also register this object for callbacks
sp.parse(xmlInputFileName, this);
} finally {
newModel = null;
}
return newModel;
}我尝试使用rollback-for="Throwable",rollback-for="Exception",rollback-for="ImportException“(我自己的异常)。然后,我在代码中手动抛出了一个异常,但它没有起作用。我不知道我是否需要一些传播参数或其他设置。看起来我并没有遗漏任何明显的东西。有人有什么建议吗?所发生的一切就是抛出一个异常,并且所有内容仍然进入数据库。我是不是错过了一个明显的步骤?
谢谢你的帮助。
发布于 2011-06-22 03:40:22
我没有得到任何建议,但我最终弄清楚了这一点,所以我想我应该把答案贴出来,以防其他人试图弄清楚回滚的东西。我打开了commons/log4j日志的调试级别,这样我就可以看到Spring框架中发生了什么。大量的输出,但很有用。
事实证明,为了启动回滚,我缺少的是理解Spring框架在哪里拦截并捕获配置中的异常。
在处理事务之前,我的第一组代码捕获了XML解析过程中的异常,只返回一个空指针供调用者处理。我没有考虑Spring将在哪里处理异常,所以如果我捕捉到异常而不重新抛出,Spring就不会知道。我的下一次尝试是传递所有异常,但没有在任何地方处理它,错误地认为Spring是魔术。好消息是事务被回滚,坏消息是一个坏的错误页面返回给用户。
所以我的“啊哈!”当我意识到配置中指定的方法(即服务中的方法)必须是抛出异常的方法时。是的,在意识到这一点之后,这似乎是显而易见的,但我是在经历了这一切后才明白这一点的。因此,在我的示例中,"uploadModelToProject“方法需要在获得异常后重新抛出它,而服务中该方法的调用者需要处理exceptoin,这将在Spring拦截它并执行回滚之后立即发生。
此外,我没有让我的XML导入器中的低级函数抛出所有这些不同类型的异常,而是创建了自己的" ImportException ",捕获异常并向上抛出ImportException。
希望这对某些人有帮助!
https://stackoverflow.com/questions/6418454
复制相似问题