Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Can';t获取要回滚的Spring事务(java+;mysql)_Java_Mysql_Spring_Transactions - Fatal编程技术网

Can';t获取要回滚的Spring事务(java+;mysql)

Can';t获取要回滚的Spring事务(java+;mysql),java,mysql,spring,transactions,Java,Mysql,Spring,Transactions,上周,我终于开始让我的应用程序使用事务。我使用的是Spring声明性事务,我知道事务本身正在工作,因为它使一个事务中的数千个插入从5-10分钟变为5-10秒。数据库是MySQL,所有的表都是InnoDB。所以我想让这个函数在不起作用时回滚。基本上,它是导入一个xml文件并从xml中构建数据库表。所以,如果某个东西失败了,我不希望部分上传,否则会不一致。我一直在严格遵循Spring文档,因为我确实运行了事务,所以我猜一般配置是正确的 以下是.xml文件的相关部分: <tx:advice id

上周,我终于开始让我的应用程序使用事务。我使用的是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>
UploadModelTopProject在SAX解析器实现中调用一个方法,然后SAX解析器实现解析

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”(我自己的异常)。然后我在代码中手动抛出了一个异常,但它没有正常工作。我不知道我是否需要一些传播参数或其他设置。我似乎没有遗漏任何明显的东西。有人有什么建议吗?所发生的一切就是抛出一个异常,并且所有内容仍然进入数据库。我是否错过了一个明显的步骤


谢谢你的帮助

我没有得到任何关于建议的建议,但我最终发现了这一点,所以我想我会发布答案,以防其他人试图找出回滚的内容。我打开了commons/log4j日志的调试级别,以便查看Spring框架中发生的一切。丰富的输出,但有用

事实证明,我缺少的是理解Spring框架在何处拦截和捕获配置中的异常,以便启动回滚

在处理事务之前,我的第一组代码捕获XML解析中的异常,并返回一个空指针供调用方处理。我没有考虑Spring将在何处处理异常,因此我没有想到,如果我捕获了异常并且没有重新调用,那么Spring就不知道了。我的下一次尝试是传递所有异常,但在任何地方都不处理它,错误地认为Spring是神奇的。好消息是事务被回滚,坏消息是错误页面被返回给用户

所以我的“哈哈!”时刻是当我意识到配置中指定的方法(即服务中的方法)必须是引发异常的方法时。是的,在意识到这一点之后,这似乎是显而易见的,但我花了很多时间才弄明白。因此,在我的示例中,“UploadModelTopProject”方法需要在获得异常后重新抛出异常,而服务中该方法的调用方需要处理异常,这将在Spring截获异常并执行回滚后立即发生

另外,我没有让XML导入器中的低级函数抛出所有这些不同类型的异常,而是创建了自己的“ImportException”,捕获异常,并向上抛出ImportException


希望这对别人有帮助

我意识到我从实际运行的代码中修改了这段代码,删除了一些固有的东西,因此finally语句是不正确的,但它确实起到了作用。
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;

}