4

我可以在withTransaction闭包内提交吗?我想在我的Quartz工作中做这样的事情:

Author.withTransaction {
    def author = Author.get(1)
    author.staus = 'processing'
    author.save()
    commit // how can i do this?
    // so some work here which takes 1-2 minutes
    author.status = 'completed'
    author.save()
}

这个想法是我想要一个状态屏幕,它会显示Author目前正在处理的所有 s,所以我想将状态设置为processing并能够从控制器中看到这个状态。

编辑:这将在没有 的情况下工作withTransaction,但我必须在withTransaction那里......看到这个问题

4

2 回答 2

2

为了从不同的未提交事务中读取值,您的数据库隔离级别必须设置为“读取未提交”,这通常表明您可能做错了什么。

你有什么理由不能把它分成单独的交易吗?一种将记录标记为“进行中”,另一种用于执行实际工作?

Author.withTransaction {
    def author = Author.get(id)
    author.status = 'processing'
    author.save()
}

Author.withTransaction() {
    def author = Author.get(id)
    // do some work
    author.status = 'completed'
    author.save()
}
于 2013-07-18T14:50:38.383 回答
0

我会尽量坚持@codelark 的方法,以编程方式处理事务并添加回滚逻辑。

巧合的是,我也在这个问题上与 codelark 一起挖掘。这是我现在拥有的:

    Author.withSession{session->
        def author = Author.get(blahId)
        try{
            def tx = session.beginTransaction()
            //Update status to processing
            author.status = 'processing'
            tx.commit()

            //Do your 1 - 3 minutes task
        } catch(e){
            //If there is any exception in that task then rollback transaction
            tx?.setRollbackOnly()
        }

        if(!tx.isRollbackOnly()){
            try {
                def tx2 = session.beginTransaction()
                //Update author status to completed
                //Few pain points can also be taken care of here, like checking if the task completed as expected etc..
                author.status = 'completed'
                tx2.commit()
            }
            catch(Exception e) {
                tx2?.setRollbackOnly() //If you want
            }
        }
    }

@Alidad 说提交/刷新发生在withTransaction块的末尾是绝对正确的。所以flush: true里面withTransaction是行不通的。

于 2013-07-18T15:11:08.057 回答