首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >grails嵌套事务bean重置

问grails嵌套事务bean重置
EN

Stack Overflow用户
提问于 2015-08-04 07:14:04
回答 2查看 656关注 0票数 0

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

代码语言:javascript
复制
//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结束后检查它。..。

代码语言:javascript
复制
 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

在通过Propagation.NESTED在引导程序中激活它之后,我尝试使用transactionManager.setNestedTransactionAllowed(true),并使用像本文grails transaction set savepoint这样的保存点,但是仍然得到了相同的结果。

我少了什么?

提前谢谢你。

EN

回答 2

Stack Overflow用户

发布于 2016-05-17 13:04:46

我参加聚会有点晚了,但万一你还没找到答案,我想我知道你为什么对交易有问题了。

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

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

编辑:为了支持事务,本文建议将表的类型设置为InnoDB。下面是一个例子,说明这是什么样子:

代码语言:javascript
复制
mysql> create table tcount_tbl
    -> (
    -> tutorial_author varchar(40) NOT NULL,
    -> tutorial_count  INT
    -> ) TYPE=InnoDB;

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

希望这能有所帮助!

票数 1
EN

Stack Overflow用户

发布于 2015-08-04 12:19:57

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

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

有关更多信息,请参见:rollbac.html

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31802914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档