ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

java – @transactional rollback无效

2019-08-25 19:01:23  阅读:332  来源: 互联网

标签: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 =     (RollBack)PortalBeanLocatorUtil.getBeanLocator().locate("rollBackBean");

        rollBack.thisWillRollBack();

现在没有测试类…没有新的任何地方……

还是行不通 …….

解决方法:

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

所以:

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

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

在你的情况下:

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

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

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

当然你需要< tx:annotation-driven />在你的spring-xml中或指示Spring否则处理@Transactional注释(参见reference).

标签:java,spring,hibernate,liferay
来源: https://codeday.me/bug/20190825/1721977.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有