@transactional回滚无法正常工作

时间:2013-05-13 12:45:47

标签: java spring hibernate liferay

以下是我所做的,我需要使用@transactional注释实现回滚,但是没有按预期工作,还需要做什么才能正常回滚?我希望在执行代码时,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 file bean refrence设置为:

<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();
}
#################编辑4

现在将回滚功能称为:

 RollBack rollBack =     (RollBack)PortalBeanLocatorUtil.getBeanLocator().locate("rollBackBean");

        rollBack.thisWillRollBack();

现在没有图片中的测试类......没有任何新的...

仍然没有工作.......

2 个答案:

答案 0 :(得分:5)

如果方法上有@Transactional注释,Spring会使用处理事务的方面包装对此方法的调用。

所以:

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

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

在你的情况下:

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

2)事件如果是,它是从类中直接调用的,所以你不会再调用包装版本。

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

当然,你需要在spring-xml中使用<tx:annotation-driven/>,或者指示Spring另外处理@Transactional注释(参见reference)。

答案 1 :(得分:1)

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