我有以下服务:
@Transactional(propagation = Propagation.REQUIRES_NEW,isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
public void test(String idEntity) throws BaseException
{
getCustomerInformationDAO().updatetm(idEntity);
}
此服务已被标记为@Service注释。
我正在从控制器调用此服务。
@RequestMapping(value="/test", method = RequestMethod.GET,produces = MediaType.APPLICATION_JSON_VALUE,consumes = MediaType.APPLICATION_JSON_VALUE)
@Override
public void test(@RequestParam("idEntity") String idEntity) throws BaseException
{
monolithicService.test(idEntity);
}
Dao(已被标记为@Repository)方法下面:
@Override
public void updatetm(String idEntity) throws BaseException
{
updateRecord( "customerinformation-update.updatelfcentitylDt", idEntity );
}
交易管理器已标记为
<tx:annotation-driven transaction-manager="transactionManager" />.
进行上述更改后,即使成功,它也不会提交事务。
有人可以帮我吗...
答案 0 :(得分:0)
我整天都在处理类似的问题。
就在我处于精神错乱的边缘时,我发现当您在测试中使用@Transactional
时,规则是不同的:默认情况下,您的更改会回滚。
快速解决方案:在方法中添加注释@Commit
,即:
@Transactional(propagation = Propagation.REQUIRES_NEW,isolation = Isolation.READ_COMMITTED, rollbackFor = Exception.class)
@Commit
public void test(String idEntity) throws BaseException
{
getCustomerInformationDAO().updatetm(idEntity);
}
您可以阅读以下文本中的一些详细信息:
访问真实数据库的测试中的一个常见问题是它们对持久性存储状态的影响。即使使用开发数据库,对状态的更改也可能会影响以后的测试。另外,许多操作(例如插入或修改持久数据)不能在事务外执行(或验证)。
TestContext框架解决了此问题。默认情况下,框架为每个测试创建并回滚事务。您可以编写可以假定存在事务的代码。如果在测试中调用事务代理对象,则对象将根据其配置的事务语义正确运行。此外,如果测试方法在测试管理的事务中运行时删除了选定表的内容,则该事务将默认回滚,并且数据库将返回到执行测试之前的状态。通过使用在测试的应用程序上下文中定义的PlatformTransactionManager bean,可以为测试提供事务支持。
如果您要提交事务(不常见,但在希望特定测试填充或修改数据库时有用),可以告诉TestContext框架使事务提交而不是使用@回滚提交注释。
https://docs.spring.io/spring/docs/current/spring-framework-reference/testing.html#testing