Hibernate Lock表

时间:2012-04-13 12:48:19

标签: sql-server hibernate seam

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对upp进行排队并在查询处停止,因此当deliveryFile()函数完成时,它会立即完成所有6个checkJobbs()。

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

有没有解决这个问题所以我可以在deliveryFile执行时执行checkJobb()?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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;