hibernate并发线程问题

时间:2015-02-19 13:41:12

标签: java multithreading spring hibernate concurrency

我们正在为我们的应用程序使用spring / hibernate ..我有一个选择的cron作业 更新父母关系的新评论,其中评论可以由另一条评论作为父级.. cron选择了大量的评论..我的问题是假设我有10条评论.. 1,2,3 ... 10

cron将以块的形式处理注释 thread-1(1..5)
thread-2(6-10)

// now in hibernate I'm using 
@PersistenceContext(name = "pu1", type = PersistenceContextType.TRANSACTION)
protected EntityManager em;

所以thread-1从父表读取以检查当前评论块是否有任何父项..然后它将默认值插入父表。

问题是线程1插入到数据库父表中的内容对于线程2是不可见的,反之亦然。

// we are using,, but this is not working
commentsService.getEntityManger().flush();

// the only way to see the changes either by adding 
commentsService.getEntityManger().getTransaction().commit() // this will throw exception (transaction is not active)

// OR by adding 
Thread.sleep(3000); //before reading from parent table.

// from logs "select * from parent" for each thread.
// by this time comment 648 was inserted to parent 
2015-02-19 04:54:09,289 DEBUG [pool-2-thread-1] (CommentsServiceImpl.java:679) - Parent Table:: 23424977 for Comment 648
2015-02-19 04:54:09,289 DEBUG [pool-2-thread-1] (CommentsServiceImpl.java:679) - Parent Table:: comment_id: 648 for Comment 648

// by this time comment 649 was inserted to parent
// comment number 649 is inserted to parent table, but thread-2 can't see comment number 648 which is supposed to be available in parent table
2015-02-19 04:54:09,292 DEBUG [pool-2-thread-2] (CommentsServiceImpl.java:679) - Parent Table:: comment_id: 23424977 for Comment 649
2015-02-19 04:54:09,292 DEBUG [pool-2-thread-2] (CommentsServiceImpl.java:679) - Parent Table:: comment_id: 649 for Comment 649

1 个答案:

答案 0 :(得分:0)

如果T1和T2都处于活动状态,并且在任一事务中,如果要查看另一个但尚未提交的数据刷新到数据库的更改,则需要将事务隔离级别更改为READ_UNCOMMITTED:

http://www.byteslounge.com/tutorials/spring-transaction-isolation-tutorial