gpt4 book ai didi

java - @事务回滚不起作用

转载 作者:行者123 更新时间:2023-12-02 13:23:07 26 4
gpt4 key购买 nike

下面是我所做的,我需要使用@transactional注释来实现回滚,但没有按预期工作,还需要做什么才能正确回滚发生?我希望当代码执行时,数据库中的结果应该是“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();
}
#################编辑4

现在调用回滚函数为:

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

rollBack.thisWillRollBack();

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

仍然无法工作......

最佳答案

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

所以:

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

2) 仅当您调用从 Spring 容器获取/注入(inject)的 bean 上的方法时,才调用包装的代码。

就您而言:

1) 代码未封装在事务方面,因为它不是公共(public)方法

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

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

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

关于java - @事务回滚不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16522412/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com