3

下面是我所做的,我需要使用@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

并写了一个类/豆为

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

现在调用回滚函数为:

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

        rollBack.thisWillRollBack();

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

还是行不通 .......

4

2 回答 2

6

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

所以:

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

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

在你的情况下:

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

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

所以解决方案是用@Transactional方法制作单独的bean,将其注入并从Response类中调用它。

当然,您需要<tx:annotation-driven/>在 spring-xml 中或指示 Spring 以其他方式处理@Transactional注释(请参阅参考资料)。

于 2013-05-13T13:03:03.613 回答
1

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

于 2013-05-13T20:14:34.613 回答