Hibernate锁表

3

Seam 2.2,Jboss 6.1,hibernate 3.5.6和MSQL Server 2008相关。并且有如下功能。

public void deliverFile() {
    EntityManager jobbEntityManager = (EntityManager)Component.getInstance("jobbEntityManager");

    JobbStatusInterface jobbStatus = new JobbStatus();
    jobbStatus.setStatus(PluginStatus.INITIATED);
    jobbEntityManager.persist(jobbStatus);


            /**

                 Code here to save a file that takes a minutes
             **/





    jobbStatus.setStatus(PluginStatus.DONE);
    jobbEntityManager.flush();





    }
    public void checkJobb(){
    EntityManager jobbEntityManager =  (EntityManager)Component.getInstance("jobbEntityManager");

        jobbEntityManager.createQuery("from JobbStatus", JobbStatus.class).getResultList();


    }

我每10秒钟会在CheckJobb上执行一次投票,如果执行deliveryFile()函数。

checkJobb队列排队并停止在查询处,所以当deliveryFile()函数完成时,它会将所有6个checkJobbs()同时完成。

即使我直接从数据库中进行选择,它也会被锁定,并在deliveryFile()完成后完成其查询。

有没有什么方法可以解决这个问题,让我在执行deliveryFile()的同时执行checkJobb()呢?

2个回答

0

不确定您想使用上述代码实现什么目标。如果您想通过在作业状态之间加载作业状态来检查是否启动了作业,则可能无法实现。由于数据尚未提交,而您在其他函数中使用了不同的会话,因此您可能无法看到数据。

只有最后一个状态值将提交到数据库。


我想在 deliverFile() 函数运行时能够执行数据库的 select 操作,但它会锁定数据库,因此我无法进行任何查询。它们会被挂起直到 deliverFile 完成。 - Trind

0

使用READ_COMMITTED_SNAPSHOT而不是普通的READ_COMMITTED隔离级别。

ALTER DATABASE <dbname> SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 
ALTER DATABASE <dbname> SET READ_COMMITTED_SNAPSHOT ON; 
ALTER DATABASE <dbname> SET MULTI_USER; 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接