我有以下情况。我有一个REST客户端,它充当其他3个REST客户端的外观。(我正在用Java编程,使用SpringBoot)客户端的职责之一包括对用户进行CRUD操作。现在,公开自己的RESTAPI的所有其他3个系统都有某种用户管理。例如,当我收到创建用户的请求时,我必须通过它们的RESTAPI在这3个系统上创建它们并保存在我的数据库中。现在,在最好的情况下,我只需调用他们的API,将用户插入我的数据库,一切都很好。但是,请考虑仅在1个外部服务上成功创建用户的场景。我是否对所有其他人重试该操作?我是否尝试删除成功的用户?正确的做法是什么? 最佳答案
具有以下相当简单的代码和正确配置的基于JTA的持久性上下文:abstractclassAbstractRepository{@PersistenceContextprotectedEntityManagerem;@Transactionalpublicsynchronizedvoidpersist(Eentity){em.persist(entity);em.flush();}}@ApplicationScopedclassMyEntityRepositoryextendsAbstractRepository{}我在调用MyEntityRepository.persist()时遇到以下
我正在使用RxJava1.1从Spring应用程序内部组成一个可观察序列,如下所示:@TransactionpublicObservablecreate(Eventevent){returnObservable.just(event).flatMap(event->{//saveeventtodb(blockingJPAoperation)Eventevent=eventRepository.save(event);returnObservable.just(event);})//asyncRESTcalltoserviceA.flatMap(this::sendEventToServ
为什么JTA不支持嵌套事务?是因为实现它们的复杂性(我对此表示怀疑)还是某些设计原则? 最佳答案 JTA规范并不是说它不支持嵌套事务-它只是不需要实现者支持它。以下摘录自JTA1.1规范:页。11,13;3.1UserTransaction接口(interface)和3.2TransactionManager接口(interface)"Supportfornestedtranactionsisnotrequired."页。13、3.2.1开始交易"IftheTransactionManagerimplementationdoesno
目前我在每个我的Controller方法之一中复制了这段代码:Transactiontransaction=HibernateUtil.getSessionFactory().getCurrentSession().getTransaction();if(!HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().isActive()){transaction.begin();}这是正确的方法还是有更好的方法,也许在我可以引用的单独类(class)中?如果是这样,如何?每次我试图将它放在一个单独的类中并
我有一个SpringWeb应用程序,它被配置为使用JDK代理进行AOP。AOP注释(例如@Transactional)在接口(interface)上声明,而不是在实现类上声明。应用程序本身工作正常,但是当我运行单元测试时,它似乎试图将CGLIB用于AOP功能(而不是JDK代理)。这会导致测试失败-我在下面附加了堆栈跟踪。我不明白为什么在运行测试时使用CGLIB,因为Spring配置与应用程序运行时基本相同。一个可能的显着差异是测试配置使用DataSourceTransactionManager而不是JTA事务管理器。测试类本身都扩展了AbstractJUnit4SpringContex
我有一个方法,标记为@Transactional。它由几个函数组成,其中一个使用JDBC,第二个使用Hibernate,第三个使用JDBC。问题是Hibernate函数所做的更改在最后一个函数中是不可见的,它适用于JDBC。@Transactionalvoidupdate(){jdbcUpdate1();hibernateupdate1();jdbcUpdate2();//resultsofhibernateupdate1()arenotvisiblehere}所有函数都配置为使用相同的数据源:代码中使用了myDataSourcebean。myDataSource.getConnect
@Transactional(noRollbackFor=RuntimeException.class)publicvoidmethodA(Entitye){service.methodB(e);}---以下服务方式---@Transactional(propagation=Propagation.REQUIRES_NEW,noRollbackFor=RuntimeException.class)publicvoidmethodB(Entitye){dao.insert(e);}当methodB()中的dao.insert(e)导致主键冲突并抛出ConstraintViolationE
我正在使用Hibernate,试图模拟对数据库中同一行的2个并发更新。编辑:我将em1.getTransaction().commit移到了em1.flush()之后;我没有收到任何StaleObjectException,这两个事务已成功提交。Sessionem1=Manager.sessionFactory.openSession();Sessionem2=Manager.sessionFactory.openSession();em1.getTransaction().begin();em2.getTransaction().begin();UserAccountc1=(User
我正在开发一个使用Spring的Java应用程序IoC和JDBC模板类。我有一个DAO类,它有4个方法:m1()到m4()。m1在表t1上执行多次插入和更新,m2在表t2上执行,m3在t3上执行,等等。DAO方法使用如下:while(true){//process&generatedatadao.m1(data1);dao.m2(data2);dao.m3(data3);dao.m4(data4);//sleep}我希望4个连续方法调用下的数据库操作是原子的,要么所有4个表都更新成功,要么一个都不更新。因此,如果在m3()中执行操作时出现错误,我想回滚在m2和m1中执行的所有更改(更新