简体   繁体   English

hibernate并发线程问题

[英]hibernate concurrency threading issue

we are using spring/hibernate for our application.. i have a cron job which picks new comments to update the parentage relation where a comment can be parented by another comments.. the cron picks the comments in chunks.. my issue is suppose i have 10 comments.. 1,2,3...10 我们正在为我们的应用程序使用spring / hibernate ..我有一个cron作业,它选择新的注释来更新父母关系,其中注释可以被另一条评论作为父级.. cron选择块中的评论..我的问题是假设我有10条评论.. 1,2,3 ... 10

the cron will process comments in chunks cron将以块的形式处理注释
thread-1 (1..5) thread-1(1..5)
thread-2 (6-10) 线程-2(6-10)

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

so thread-1 reads from parent table to check if there is any parents for the current chunk of comments.. then it inserts default values to parent table. 所以thread-1从父表中读取以检查当前评论块是否有任何父项。然后它将默认值插入父表。

the issues is what thread-1 inserts into database parent table is not visible to thread-2 and vice versa. 问题是线程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

If T1 and T2 are both active and if, in either transaction, you want to see changes flushed to the database by the other but not yet committed you will need to change the transaction isolation level to READ_UNCOMMITTED: 如果T1和T2都处于活动状态,并且在任一事务中,如果要查看另一个但尚未提交的刷新到数据库的更改,则需要将事务隔离级别更改为READ_UNCOMMITTED:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM