2013-05-13 57 views
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 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(); 

在画面没有测试类现在......没有新的任何地方......

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

+0

您正在使用哪些DBMS? Postgres的?甲骨文? – 2013-05-13 13:14:18

回答

5

如果你在方法上有一个@Transactional注解,Spring用方面处理事务来包装对这个方法的调用。

所以:

1)只有公共methodes可以包裹在方面

2)你叫包裹码仅当你调用/取自一个bean由Spring容器注入的方法。

在你的情况:

1)的代码不裹事务方面,因为它不是公共方法

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

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

当然,您需要在您的spring-xml中使用<tx:annotation-driven/>,否则请指示Spring处理@Transactional注释(请参阅reference)。

+0

你可以请检查...我已经更新了我的答案..并按照你的意见... – 2013-05-13 15:38:54

+0

你如何激活交易支持?你的XML文件中是否有?你读过参考书吗? – 2013-05-13 15:58:40

+0

是的,我做了..在我的transactionManager“globalRollbackOnParticipationFailure”被设置为false ..是否意味着某事...是这个原因..不回滚?? – 2013-05-13 16:09:14

1

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

+0

检查编辑2块..done如你所说..still不工作....最后..可以有理由,我在另一个函数与“事务性”调用“交易”...意思是我嵌套@交易的图片...任何想法? – 2013-05-14 05:37:47

+0

在这一点上,我不知道你在做什么。在你盲目创建对象之前,你需要花一些时间和Spring在一起。你为什么不发布一些真实的代码,并显示你的整个调用堆栈和配置,换句话说,因为你现在拥有的是无法理解的。 – fpmoles 2013-05-14 13:41:41

+0

已经发布了我的完整代码...但一个需要知道liferay哟完全理解它..没有想法,哪部分发布liferay内部....是的,但真正的说它是越来越垃圾...谢谢帮助...将删除此帖子并创建新的.. – 2013-05-14 15:14:41