最近碰到一个JPA事务的问题,在小的线程数量下,JPA的事务能正常提交,数据也能正常插入到数据库中,但是发现在线程数量多的时候,出现数据插入(persist)不报错,但是也没有提交到数据库中,仔细打印日志,发现正常和不正常时,日志上代码的执行有区别。
无问题的执行日志:
[org.springframework.orm.jpa.JpaTransactionManager] [365] DEBUG [Creating new transaction with name [com.pilicat.repository.BaseDao.save]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''] [org.springframework.orm.jpa.JpaTransactionManager] [323] DEBUG [Opened new EntityManager [org.hibernate.ejb.EntityManagerImpl@de1f47] for JPA transaction] [org.springframework.jdbc.datasource.DriverManagerDataSource] [162] DEBUG [Creating new JDBC DriverManager Connection to [jdbc:mysql://127.0.0.1:3306/TestDb]] [org.springframework.orm.jpa.JpaTransactionManager] [355] DEBUG [Exposing JPA transaction as JDBC transaction [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@69e732]] Hibernate: insert into t_app_log (appKey, buyer_nick, createTime, modified, oid, payment, seller_id, seller_nick, status, tid, type) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [org.springframework.orm.jpa.JpaTransactionManager] [752] DEBUG [Initiating transaction commit] [org.springframework.orm.jpa.JpaTransactionManager] [462] DEBUG [Committing JPA transaction on EntityManager [org.hibernate.ejb.EntityManagerImpl@de1f47]] [org.springframework.orm.jpa.JpaTransactionManager] [548] DEBUG [Closing JPA EntityManager [org.hibernate.ejb.EntityManagerImpl@de1f47] after transaction] [org.springframework.orm.jpa.EntityManagerFactoryUtils] [328] DEBUG [Closing JPA EntityManager]
有问题的执行日志:
[org.springframework.orm.jpa.JpaTransactionManager] [365] DEBUG [Creating new transaction with name [com.pilicat.repository.BaseDao.save]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT; ''] [org.springframework.orm.jpa.JpaTransactionManager] [323] DEBUG [Opened new EntityManager [org.hibernate.ejb.EntityManagerImpl@1fc790a] for JPA transaction] [org.springframework.jdbc.datasource.DriverManagerDataSource] [162] DEBUG [Creating new JDBC DriverManager Connection to [jdbc:mysql://127.0.0.1:3306/TestDb]] [org.springframework.orm.jpa.JpaTransactionManager] [355] DEBUG [Exposing JPA transaction as JDBC transaction [org.springframework.orm.jpa.vendor.HibernateJpaDialect$HibernateConnectionHandle@cb590]] [org.springframework.orm.jpa.EntityManagerFactoryUtils] [193] DEBUG [Opening JPA EntityManager] [org.springframework.orm.jpa.EntityManagerFactoryUtils] [198] DEBUG [Registering transaction synchronization for JPA EntityManager] [org.springframework.orm.jpa.EntityManagerFactoryUtils] [328] DEBUG [Closing JPA EntityManager] [org.springframework.orm.jpa.JpaTransactionManager] [752] DEBUG [Initiating transaction commit] [org.springframework.orm.jpa.JpaTransactionManager] [462] DEBUG [Committing JPA transaction on EntityManager [org.hibernate.ejb.EntityManagerImpl@1fc790a]] [org.springframework.orm.jpa.JpaTransactionManager] [548] DEBUG [Closing JPA EntityManager [org.hibernate.ejb.EntityManagerImpl@1fc790a] after transaction] [org.springframework.orm.jpa.EntityManagerFactoryUtils] [328] DEBUG [Closing JPA EntityManager]
注意看执行正常的程序日志,在persist数据后,是有产生insert的sql语句的。
奇怪的是,执行测试环境,数据全部可以正常插入到数据库中。
但是部署到生产环境,数据处理量一上去,就persist方法调用后,并没有提交到数据了,更奇怪的是,也没有报任何错误。(数据保存方法上有Transactional注解)
另外,我发现有问题的日志中,多了2行日志:
[org.springframework.orm.jpa.EntityManagerFactoryUtils] [193] DEBUG
[Opening JPA EntityManager]
[org.springframework.orm.jpa.EntityManagerFactoryUtils] [198] DEBUG
[Registering transaction synchronization for JPA EntityManager]
为什么在执行的时候,会多出这2行呢?
不知道有没有对JPA深入了解的大侠可以指点一下?先谢了。
刚看了一下spring orm的源码,是因为 TransactionSynchronizationManager.isSynchronizationActive()为true的情况下,出现的同步事务<arel="nofollow">http://stackoverflow.com/questions/8833219/why-nothing-happens-when-i-persist<arel="nofollow">http://www.adam-bien.com/roller/abien/entry/don_t_use_jpa_s
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。