grails - grails嵌套事务Bean重置

标签 grails transactions nested-transactions

我将grails 1.3.7与Oracle 11g一起使用,并试图管理内部事务。
我有一个传递给事务性(Propagation.REQUIRED)服务方法的bean Person,该方法进行了一些修改。然后,将其传递到另一个进行其他修改的事务(propagation = Propagation.REQUIRES_NEW)方法,然后引发Exception。
我期望看到的是对第二项服务的所有修改的回滚,但仍然对第一种服务有效。这种情况:

//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控制台并在数据库结束后检查数据库。
...
 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.setNestedTransactionAllowed(true)在 bootstrap 中激活它后使用Propagation.NESTED,并像本文中那样使用保存点
grails transaction set savepoint
但仍然得到相同的结果。

我想念什么???

先感谢您。

最佳答案

我参加聚会有点晚了,但是如果您找不到答案,我想我知道您为什么在交易方面遇到问题。

我查看了您与有关保存点问题的讨论的链接。根据讨论,您正在使用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类型。

希望这可以帮助!

关于grails - grails嵌套事务Bean重置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31802914/

相关文章:

grails - 如何从 Bootstrap 显示 grails 错误

javascript - 在Grails中<g:remotelink>/Ajax调用之后的下拉 Bootstrap

Grails 命令对象未绑定(bind)到 'def' 类型

c# - C# 中的连接登记到底是什么

php - Magento 捕获异常并回滚数据库事务

css - 用于 unicode 字符的 Flying Saucer 字体

mysql - 交易陷阱 22

sql-server - SAVE TRANSACTION 与 BEGIN TRANSACTION (SQL Server) 如何很好地嵌套事务

sql-server - 嵌套事务的目的

jakarta-ee - EJB 3.0 - 嵌套事务!= 需要新的?