以下是我所做的,我需要使用@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();
现在没有图片中的测试类......没有任何新的...
仍然没有工作.......
答案 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注入,然后让我知道,但是上面显示的代码永远不会用于事务管理。