提问者:小点点

grails嵌套事务bean重置


我正在使用grails 1.3.7和Oracle 11g,并试图管理内部事务。我有一个bean Person,它被传递给一个事务性(传播.要求)服务方法,该方法进行了一些修改。然后它被传递给另一个事务性(传播=传播.REQUIRES_NEW)方法,该方法进行了一些其他修改,然后抛出一个异常。我期望看到的是第二个服务的所有修改的回滚,但仍然有效第一个服务的修改。这就是情况:

//outer transaction
class MyService {

    def nestedService

    @Transactional(propagation = Propagation.REQUIRED)
    public void testRequiredWithError(Person person) {
        person.name = 'Mark'
        try {
            nestedService.testRequiresNewWithError(person)
        } catch (RuntimeException e) {
            println person.age //this prints 15
            println e
        }
    }
}//end MyService

//inner transaction
class NestedService{

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void testRequiresNewWithError(Person person) {
        person.age = 15 //expected after Exception will be discarded
        throw new RuntimeException("Rollback this transaction!")
    }
}

然后我运行grails控制台并在结束后检查DB。…

 def p = Person.get(671)
    def myService = ctx.myService 

    println p.name //'John'...from DB
    println p.age  //25...from DB

    myService .testRequiredWithError(p)

    println p.name // 'Mark'....correct
    println p.age  //  15....UNEXPECTED..
    //same result checking on the DB after console ends and transaction flushes

我试图在transactionManager. setNestedTransaction可允许(true)的引导程序中激活它后使用传播.NESTED,并使用像这篇文章中的保存点grails事务集保存点,但仍然得到相同的结果。

我错过了什么????

提前谢谢你。


共2个答案

匿名用户

我参加聚会有点晚了,但是如果你还没有找到你的答案,我想我知道你为什么在交易上有问题。

我看了你关于保存点问题的讨论链接。根据那个讨论,你正在使用MySQL作为你的数据源。默认情况下,MySQL不支持事务,为了做到这一点,你需要以一种特殊的方式创建你的表。我在下面提供了一个链接,解释了当你想使用事务时,你应该如何在MySQL中创建你的表:

http://www.tutorialspoint.com/mysql/mysql-transactions.htm

编辑:本文建议将表的类型设置为InnoDB以支持事务。以下是一个示例:

mysql> create table tcount_tbl
    -> (
    -> tutorial_author varchar(40) NOT NULL,
    -> tutorial_count  INT
    -> ) TYPE=InnoDB;

可能值得注意的是,这不是唯一支持事务的类型,但却是最常见的。MySQL 5.5及更高版本应自动将表创建为InnoDB类型。

希望这有帮助!

匿名用户

我将测试p. isAttached(),因为事务回滚将域对象从Hibernate会话中分离出来。此外,在测试中,我将从数据库重新加载域对象-有效地p=Pers.get(671)再次从数据库重新加载数据。

我认为age属性在测试后设置为15的原因是在异常之后域对象和数据库不同步(并且域对象被分离)。

更多信息见:https://weblogs.java.net/blog/blog/davidvc/archive2007/04/jpa_and_rollbac.html