将声明性spring事务(Grails服务)传播到纯JDBC代码

时间:2013-02-21 17:01:25

标签: grails jdbc transactions spring-transactions

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

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的事务管理。我不确定如何继续。

谢谢!

1 个答案:

答案 0 :(得分:0)

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

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

sql = new Sql(dataSource.getConnection())

如果您声明

sql = new Sql(dataSource)

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

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