0

Grails サービスにこの Groovy 疑似スクリプトがあります。

sql.eachRow("""
 select id, col1, col2 
 from mytab
 where col1 is null or col2 is null
"""
){
 ... some code to produce c1, c2 here ...
 sql.execute("""
    update mytab
    set col1 = ${c1}, col2 = ${c2}
    where id = it.id
 """)
}

問題は、更新が eachRow ループの最後にのみ DB にコミットされることです。sql.execute 呼び出しで更新を正確にコミットしたかったのです。

sql.eachRow の直前に sql.resultSetConcurrency = GroovyResultSet.CONCUR_UPDATABLE を挿入しようとしましたが、更新はループの終了後にのみコミットされ続けます。また、sql.execute() の直後に sql.commit() が呼び出されましたが、これも成功しませんでした。

SQL 接続は DBCP Tomcat データソースから来て、Oracle 8.1.7 データベースにアクセスします。

ありがとうございました!

4

1 に答える 1

0

Grails サービス メソッドの呼び出しは、デフォルトでは、トランザクションで自動的にラップされます。チェックされていない (!) 例外がスローされた場合、db トランザクションは下層の Spring コンポーネントによってロールバックされます。この動作を無効にするには、こちらで説明されているように、を使用@Transactionalまたは指定する必要があります。static transactional = false

于 2012-11-13T13:00:39.190 に答える