我有一个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的事务管理。我不确定如何继续。
谢谢!
答案 0 :(得分:0)
如评论中所述,使用dataSource.getConnection()
您拥有动态GORM方法使用的相同连接。
另外值得注意的是,这是声明groovy.sql.Sql
实例的正确方法:
sql = new Sql(dataSource.getConnection())
如果您声明
sql = new Sql(dataSource)
您的sql命令可能使用不同的连接(在Oracle数据库中与我一起发生)。
另一种可能性是使用cacheConnection闭包,以确保groovy sql的所有执行都使用相同的连接。