Java @事务回滚不工作
下面是我所做的,我需要使用@transactional annotation实现回滚,但没有按预期工作,还需要做什么才能实现正确的回滚??我希望在db中执行代码时,结果应该是“testingOne”,当前它被设置为“notRollBacked”。你能指出我的错误吗Java @事务回滚不工作,java,spring,hibernate,liferay,Java,Spring,Hibernate,Liferay,下面是我所做的,我需要使用@transactional annotation实现回滚,但没有按预期工作,还需要做什么才能实现正确的回滚??我希望在db中执行代码时,结果应该是“testingOne”,当前它被设置为“notRollBacked”。你能指出我的错误吗 public Response deleteUser(Request argVO)throws Exception { Users users = UsersLocalServiceUtil.getUsers("sagar"
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();
}
现在图片中没有测试类…任何地方都没有新的
仍然不工作……如果您在方法上有一个
@Transactional
注释,Spring会用处理事务的方面包装对该方法的调用
因此:
1) 只有公共方法可以包装在方面中
2) 只有在调用从Spring容器获取/注入的bean上的方法时,才能调用包装代码
就你而言:
1) 代码没有包装在事务方面,因为它不是公共方法
2) 事件,则直接从类内调用它,因此无论如何都不会调用包装版本
因此,解决方案是使用@Transactional
方法创建单独的bean,将其注入Response
类并从中调用它
当然,您需要在SpringXML中使用
,或者指示spring以其他方式处理@Transactional
注释(请参阅)。问题在于您不在应用程序上下文中。您正在创建一个类的新实例,new在Spring中很糟糕,非常糟糕。从应用程序上下文获取测试实例,而不是通过创建新实例,除非您在测试中启动应用程序上下文。尝试在您上面提到的类中进行Autowire测试,或者从Spring中注入它,然后让我知道,但是您上面显示的代码永远无法用于事务管理。您使用的是哪种DBMS?博士后?甲骨文?你能查一下。。。我已经更新了我的答案。。并跟随您的评论…您如何激活事务支持?您的XML文件中是否有?你看过推荐信了吗?是的我看过。。在我的transactionManager中,“globalRollbackOnParticipationFailure”设置为false..这是否意味着。。。这就是不回滚的原因吗?在调试器中设置陷阱并检查您是否在代理中。我不知道什么是事务级门户-它不是标准的,由DB支持。如果您在事务代理内,则可能是DB问题或此门户隔离级别问题。请检查编辑2块..按您所说的完成..仍不工作。。。。最后..是否有理由在另一个函数中用“transactional”调用“transactional”。。。意思是我在图片中嵌套了@transactional。。。知道吗?现在我不知道你在做什么。在盲目创建对象之前,您需要花一些时间使用Spring。你为什么不发布一些真实的代码,展示你的整个调用堆栈和配置,换言之,因为你现在所拥有的是不可理解的。你已经发布了我的完整代码…但是你需要了解liferay,你完全理解它…不知道发布liferay内部的哪一部分。。。。是的,但我真的说这是垃圾。。。谢谢你的帮助。将删除此帖子并创建新帖子。。
RollBack rollBack = (RollBack)PortalBeanLocatorUtil.getBeanLocator().locate("rollBackBean");
rollBack.thisWillRollBack();