Hibernate 的 JPA事务问题

grantliping 发布于 2013/08/31 22:25
阅读 2K+
收藏 2

最近碰到一个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深入了解的大侠可以指点一下?先谢了。

加载中
0
TavenLi
TavenLi
刚看了一下spring  orm 的源码,是因为 TransactionSynchronizationManager.isSynchronizationActive() 为 true的情况下,出现的同步事务
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部