【发布时间】:2011-09-19 02:15:23
【问题描述】:
上周我终于开始让我的应用使用交易。我正在使用 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 实现中的一个方法,然后实现解析
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"(我自己的异常)。然后我在代码中手动抛出了一个异常,它没有工作。我不知道我是否需要一些传播参数或其他设置。似乎我没有遗漏任何明显的东西。有人有什么建议吗?所发生的一切都是抛出一个异常,一切仍然进入数据库。我错过了一个明显的步骤吗?
感谢您的帮助。
【问题讨论】:
-
我意识到我从实际运行的代码中修改了这段代码以删除一些专有的东西,所以 finally 语句是不正确的,但它确实有效。
标签: java mysql spring transactions