Tag: transactions

在Spring 3 / Hibernate中回滚事务的最佳实践

引用Spring文档 : 任何RuntimeException都会触发回滚,任何已检查的Exception都不会 引用javapractices.com 未经检查的例外情况: 表示程序中的缺陷(错误) – 通常是传递给非私有方法的无效参数。 引用来自Gosling,Arnold和Holmes的Java编程语言:“未经检查的运行时exception表示一般来说,它反映了程序逻辑中的错误,并且无法在运行时合理地恢复。” 是RuntimeException的子类,通常使用IllegalArgumentException,NullPointerException或IllegalStateException实现 方法没有义务为其实现抛出的未经检查的exception建立策略(并且它们几乎总是不这样做) 检查exception: 代表程序直接控制范围之外的区域中的无效条件(无效的用户输入,数据库问题,网络中断,缺少文件) 是Exception的子类 方法有义务为其实现抛出的所有已检查exception建立策略(将已检查的exception传递到堆栈的更高位置,或以某种方式处理它) 如果在我的业务逻辑中发现问题并且我想要回滚更改,我必须抛出一个新的RuntimeException? 它不是真正的RuntimeException(未经检查的exception),因为我已经在逻辑中识别出它。 或许我误解了这些概念? 我真正的问题是 ,在我的@Transactional服务方法中回滚事务的最佳做法是什么?

如何获取@PostConstruct CDI bean方法的事务

我正在试验Java EE 7,CDI,JPA和JSF。 当webapp启动时,我想在我的CDI bean(标有@PostConstruct)中运行一个初始化方法,该方法可以对数据库进行一些操作(插入一些行等等)。 为此,我需要一个交易,但这并不像我预期的那么容易。 我已经尝试将@Transactional注释添加到我的方法中,但显然它只适用于EJB。 我实际上尝试将我的bean转换为EJB而不是CDI bean,但我仍然没有得到我的@PostConstruct方法的事务。 它适用于bean中的其他方法,但不适用于我的@PostConstruct初始化方法。 然后我读到了创建方法拦截器来获取CDI bean的事务: http://eubauer.de/kingsware/2012/01/16/cdi-and-transactions-eg-in-jboss-7-0-2/ 我也试过这个,但没有运气。 它也不起作用。 那么如何在CDI bean中获取@PostConstruct初始化方法的事务呢?

Weblogic错误:由以下原因引起:weblogic.transaction.internal.AppSetRollbackOnlyException:在事务上调用setRollbackOnly

我正在将Jboss 7as的应用程序移植到Weblogic 12c。 到目前为止,我能够运行应用程序并在数据库中创建新记录。 但是,我只在尝试更新现有记录时才会收到以下错误; Error committing transaction: javax.ejb.TransactionRolledbackLocalException: Error committing transaction: at weblogic.ejb.container.internal.EJBRuntimeUtils.throwTransactionRolledbackLocal(EJBRuntimeUtils.java:231) at weblogic.ejb.container.internal.EJBRuntimeUtils.throwEJBException(EJBRuntimeUtils.java:134) at weblogic.ejb.container.internal.BaseLocalObject.postInvoke1(BaseLocalObject.java:362) at weblogic.ejb.container.internal.BaseLocalObject.__WL_postInvokeTxRetry(BaseLocalObject.java:205) at weblogic.ejb.container.internal.SessionLocalMethodInvoker.invoke(SessionLocalMethodInvoker.java:46) … Caused by: weblogic.transaction.internal.AppSetRollbackOnlyException: setRollbackOnly called on transaction 当我在事务是容器管理的无状态EJB中调用javax.persistence.EntityManager.merge(Object)时,会发生错误。 我最初的想法是容器在某处调用javax.transaction.UserTransaction.setRollbackOnly() ,所以我将EJB的事务管理更改为BMT并自己管理事务。 发生了同样的错误。 我怀疑我的Datasource或persistence.xml有问题。 下面是我的persistence.xml的属性 org.hibernate.ejb.HibernatePersistence myDS 请协助。

multithreading事务在持久化实体中通过wildfly挂起到postgresql

我有一个像这样的entityManager的bean定义: @Stateless public class JPABean { private static final Logger LOG = Logger.getLogger(JPABean.class); @PersistenceContext(unitName = “myPersistanceSettings”) private EntityManager em; public void write(T o) { LOG.info(“PERSISTING”); em.persist(o); LOG.info(“FLASHING”); em.flush(); LOG.info(“SUCCESS”); } 我的persistance.xml org.hibernate.ejb.HibernatePersistence java:jboss/datasources/myDS 我的api: @Path(“activityAPI”) public class ActivityAPI { private static final Logger log = Logger.getLogger(ActivityAPI.class); @EJB private JPABean activityJpa; @POST @Consumes(MediaType.APPLICATION_JSON) @Produces(MediaType.APPLICATION_JSON) public Response […]

Spring @Transactional无效

我正在尝试使用带注释的TX Spring支持。 应用上下文XML: … 实际代码: public class Repository { @Transactional public void save(Op op) { System.out.println(“Transaction active:::: ” + TransactionSynchronizationManager.isActualTransactionActive()); … } } 调用代码: @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = {“/integration-context.xml”}) public class RepositoryTest { @Autowired private Repository repository; @Test public void testRepositoryPersistence() { Op op = mock(Op.class); repository.save(op); } } 它给了FALSE。 我究竟做错了什么?

Spring-MVC:创建良好的基础架构(配置)并避免重复

我有一段时间以来一直致力于Spring-MVC应用程序。 最近我遇到了@Scheduled方法的一些问题,我注意到整个配置加载了4次。 因为@Scheduled方法被调用了4次。 3个配置不正确,用NullPointerException消失(这是我在SO上被告知的),并且幸存下来了。 我非常有兴趣知道如何正确配置我的项目,因此只有一个配置被加载,而不是4,并且在此过程中了解Spring-MVC,Spring。 由于servlet-context很大,我在pastebin上发布web.xml,所以我也可以放置JAVA代码。 Servlet-context.xml: com.journaldev.spring.model.Person com.journaldev.spring.model.Notes com.journaldev.spring.model.Canvas com.journaldev.spring.model.Section com.journaldev.spring.model.Attachment com.journaldev.spring.model.GroupAccount com.journaldev.spring.model.GroupMembers com.journaldev.spring.model.GroupCanvas com.journaldev.spring.model.GroupSection com.journaldev.spring.model.GroupNotes com.journaldev.spring.model.GroupAttachments com.journaldev.spring.model.Token com.journaldev.spring.model.WaitingMembers com.journaldev.spring.model.NoteHistory com.journaldev.spring.model.GroupNoteHistory com.journaldev.spring.model.Feedback com.journaldev.spring.model.UnreadNotes com.journaldev.spring.model.SessionState com.journaldev.spring.model.FeatureRequest com.journaldev.spring.model.FeatureComment com.journaldev.spring.model.FeatureLike com.journaldev.spring.model.OnlineUsers com.journaldev.spring.model.NoteCount com.journaldev.spring.model.NoteLock com.journaldev.spring.model.ChatMessages com.journaldev.spring.model.Conversation com.journaldev.spring.model.Replies com.journaldev.spring.model.Notification com.journaldev.spring.model.Statistics com.journaldev.spring.model.PrivateChannel com.journaldev.spring.model.GroupChannels org.hibernate.dialect.PostgreSQL9Dialect false 200 200 1000 <!– 1000 true–> update <!– –> <!—-> 如上所述, 这是web.xml的URL, 这里是security-application.context.xml 在整个项目中,模型如下所示: @Entity […]

我们如何才能获得JPA EntityManager Flush工作

我的问题是为什么冲洗不起作用: public void ejbService(){ Customer c = em.find(Customer.class,1); c.setName(“newName”); em.flush(); //at this point when I query mysql table I can not see “newName” thread.sleep(10000); c.setName(“anotherName”); } 完成方法后,我在db中看到“anotherName”,我也用em.find(Customer.class,1,Lock.None)检查它; 但仍然没有奏效 RGDS

调用entityManager.getTransaction()时的EJBException

这可能是微不足道的,但我会喜欢一些帮助。 我明白了: javax.ejb.EJBException: java.lang.IllegalStateException: Illegal to call this method from injected, managed EntityManager 11:54:37,105 ERROR [STDERR] at org.jboss.ejb3.tx.Ejb3TxPolicy.handleExceptionInOurTx(Ejb3TxPolicy.java:77) 11:54:37,105 ERROR [STDERR] at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:83) 11:54:37,105 ERROR [STDERR] at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:190) 做的时候: @PersistenceContext(unitName = “someName”) private EntityManager em; … final EntityManager entityManager = getEntityManager(); final EntityTransaction tx = entityManager.getTransaction(); // here 谁能告诉我原因可能是什么?

JPA多个交易经理

我有一个applicationContext.xml文件,它有一个在Spring中间件自定义应用程序中配置的两个org.springframework.orm.jpa.JpaTransactionManager(每个都有自己的持久性单元,不同的数据库)。 我想使用基于注释的事务(@Transactional),不要乱用TransactionStatus提交,保存和回滚。 一位同事提到,当有多个事务管理器时,即使正确配置了上下文文件(引用转到正确的持久性单元),有些事情也会混淆。任何人都会看到问题吗? 在您的配置中,您是否有两个事务管理器? 你有txManager1和txManager2吗? 这就是我对JPA的看法,两个不同的Spring bean是事务管理器。

了解EJB3 / JPA容器级事务和隔离级别

考虑一下我正在使用的一些代码的简化视图: @Stateless(…) @Remote(…) @TransactionAttribute(TransactionAttributeType.MANDATORY) public class FirstEjbType { @EJB(…) private SecondEjbType secondEjb; @EJB(…) private ThirdEjbType thirdEjb; public void doSomething() { secondEjb.doSomething(); // WRITES SOMETHING TO THE DATABASE thirdEjb.doSomething(); // CAN’T SEE THAT SOMETHING IN THE DATABASE! } 我已经在类级别将TransactionAttribute注释设置为MANDATORY 。 我理解这意味着必须在提供的事务中调用所有方法,如doSomething() 。 在这种情况下,我们使用容器管理的事务。 在SecondEjbType或ThirdEjbType中SecondEjbType不使用TransactionAttribute ……在类和方法级别都没有。 我理解这意味着secondEjb.doSomething()和thirdEjb.doSomething()都将在为firstEjb.doSomething()提供的事务中运行。 但是,我真的错过了什么 ! 如代码注释所示…… secondEjb将数据写入数据库, thirdEjb将该数据作为其操作的一部分进行读取。 由于所有这些都在同一个事务中运行,我不希望隔离级别存在任何问题。 但是,无论出于何种原因, secondEjb数据库写入对thirdEjb不可见。 我已经将跟踪一直转到最大值,并且显然没有exception或错误或回滚问题……初始写入对于后续读取是不可见的。 我并不是自称是世界上最伟大的交易管理大师……我是否错过了一些明显的东西,或者我的概念理解是否基本正确,问题可能在其他地方? […]