Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.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
Java @事务回滚不工作_Java_Spring_Hibernate_Liferay - Fatal编程技术网

Java @事务回滚不工作

Java @事务回滚不工作,java,spring,hibernate,liferay,Java,Spring,Hibernate,Liferay,下面是我所做的,我需要使用@transactional annotation实现回滚,但没有按预期工作,还需要做什么才能实现正确的回滚??我希望在db中执行代码时,结果应该是“testingOne”,当前它被设置为“notRollBacked”。你能指出我的错误吗 public Response deleteUser(Request argVO)throws Exception { Users users = UsersLocalServiceUtil.getUsers("sagar"

下面是我所做的,我需要使用@transactional annotation实现回滚,但没有按预期工作,还需要做什么才能实现正确的回滚??我希望在db中执行代码时,结果应该是“testingOne”,当前它被设置为“notRollBacked”。你能指出我的错误吗

 public Response deleteUser(Request argVO)throws Exception
{
    Users users = UsersLocalServiceUtil.getUsers("sagar");
    users.setUserName("testingOne");
    UsersLocalServiceUtil.updateUsers(users);
    try
    {
        testRollbackFunction();
    }
    catch (Exception ex)
    {

    }
    return new Response();
}


@Transactional(isolation = Isolation.PORTAL, rollbackFor =
    {PortalException.class, SystemException.class})
private void testRollbackFunction() throws Exception
{
    Users users = UsersLocalServiceUtil.getUsers("sagar");
    users.setUserName("notRollbacked");
    UsersLocalServiceUtil.updateUsers(users);
    throw new PortalException();
}
**************编辑1***************** 我做了回答中提到的事情:

我确实从上下文中提取了bean

并编写了一个类/bean作为

  @Transactional(isolation = Isolation.PORTAL, rollbackFor =
{PortalException.class, SystemException.class})
public class RollBack
{

@Transactional(isolation = Isolation.PORTAL, rollbackFor =
    {PortalException.class, SystemException.class})
public void thisWillRollBack() throws Exception
{
    Users users = UsersLocalServiceUtil.getUsers("sagar");
    users.setBarringReason("notRollbacked");
    UsersLocalServiceUtil.updateUsers(users);
    throw new PortalException();
}
}

spring xml文件bean引用设置为:

<bean id="rollBackBean" class="com.alepo.RollBack">

</bean>

public Response myMethod(Request argVO)throws Exception
{
    Users users = UsersLocalServiceUtil.getUsers("sagar");
    users.setBarringReason("testingOne");
    UsersLocalServiceUtil.updateUsers(users);
    try
    {
        Test test = new Test();
        Object obj = test.getBean();
        RollBack rollBack = (RollBack)obj;
        rollBack.thisWillRollBack();
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
    }
    return new Response();
}
现在图片中没有测试类…任何地方都没有新的


仍然不工作……

如果您在方法上有一个
@Transactional
注释,Spring会用处理事务的方面包装对该方法的调用

因此:

1) 只有公共方法可以包装在方面中

2) 只有在调用从Spring容器获取/注入的bean上的方法时,才能调用包装代码

就你而言:

1) 代码没有包装在事务方面,因为它不是公共方法

2) 事件,则直接从类内调用它,因此无论如何都不会调用包装版本

因此,解决方案是使用
@Transactional
方法创建单独的bean,将其注入
Response
类并从中调用它


当然,您需要在SpringXML中使用
,或者指示spring以其他方式处理
@Transactional
注释(请参阅)。

问题在于您不在应用程序上下文中。您正在创建一个类的新实例,new在Spring中很糟糕,非常糟糕。从应用程序上下文获取测试实例,而不是通过创建新实例,除非您在测试中启动应用程序上下文。尝试在您上面提到的类中进行Autowire测试,或者从Spring中注入它,然后让我知道,但是您上面显示的代码永远无法用于事务管理。

您使用的是哪种DBMS?博士后?甲骨文?你能查一下。。。我已经更新了我的答案。。并跟随您的评论…您如何激活事务支持?您的XML文件中是否有?你看过推荐信了吗?是的我看过。。在我的transactionManager中,“globalRollbackOnParticipationFailure”设置为false..这是否意味着。。。这就是不回滚的原因吗?在调试器中设置陷阱并检查您是否在代理中。我不知道什么是事务级门户-它不是标准的,由DB支持。如果您在事务代理内,则可能是DB问题或此门户隔离级别问题。请检查编辑2块..按您所说的完成..仍不工作。。。。最后..是否有理由在另一个函数中用“transactional”调用“transactional”。。。意思是我在图片中嵌套了@transactional。。。知道吗?现在我不知道你在做什么。在盲目创建对象之前,您需要花一些时间使用Spring。你为什么不发布一些真实的代码,展示你的整个调用堆栈和配置,换言之,因为你现在所拥有的是不可理解的。你已经发布了我的完整代码…但是你需要了解liferay,你完全理解它…不知道发布liferay内部的哪一部分。。。。是的,但我真的说这是垃圾。。。谢谢你的帮助。将删除此帖子并创建新帖子。。
 RollBack rollBack =     (RollBack)PortalBeanLocatorUtil.getBeanLocator().locate("rollBackBean");

        rollBack.thisWillRollBack();