1

我有一个 Grails 服务方法,它调用一个普通的 Java 类来使用 JDBC 将一些数据保存到数据库中。接下来,grails 服务方法也写入同一个数据库。这一切都应该发生在同一个事务中。

def dataSource

def myServiceMethod() {
    MyJDBCClass jdbcClass = new MyJDBCClass(dataSource.getConnection())
    jdbcClass.savePerson(new PersonDto("Bob"))

    Person p = Person.findByFirstName("Bob")
    p.firstName = "John"
    if (p.firstName == "John") {
        throw new RuntimeException("Test rollback of Bob")
    }
    p.save()
}

myServiceMethod 当前使用默认传播类型:PROPAGATION_REQUIRED(因为它是一种服务方法)。

MyJDBCClass 是纯 Java/JDBC 并且在一个单独的 JAR 文件中,理想情况下我们不希望对 Spring 的事务管理有任何依赖。我不确定如何进行。

谢谢!

4

1 回答 1

0

如评论中所述,使用dataSource.getConnection()动态 GORM 方法使用的连接相同。

另外值得注意的是,这是声明groovy.sql.Sql实例的正确方法:

sql = new Sql(dataSource.getConnection())

如果你声明像

sql = new Sql(dataSource)

您的 sql 命令可能使用不同的连接(在 Oracle 数据库中发生在我身上)。

另一种可能性是使用cacheConnection闭包,以确保所有 groovy sql 的执行都将使用相同的连接。

于 2013-02-22T16:56:40.477 回答