2012-11-13 31 views
0

的最後,我有一個Grails服務這Groovy的僞腳本更新:常規的SQL更新遊標 - 沒有承諾直到光標

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數據庫。

謝謝!

+0

由於http://groovy.codehaus.org/api/groovy/sql/Sql.html#commit(),commit()被忽略,因爲sql是從數據源創建的 – tmanolatos

+0

我不得不把 **靜態transactional = false ** 在我的服務中。 現在它按預期工作... 請參閱http://grails.org/doc/latest/guide/single.html#services – tmanolatos

回答

0

默認情況下,Grails服務方法調用會自動用事務打包。如果拋出一個未經檢查的(!)異常,那麼db事務將被底層的Spring組件回滾。要禁用此行爲,您必須使用@Transactional或指定static transactional = falseas described here

+0

ups,只是看到您已經找到答案。也許這個答案有助於其他人遇到同樣的問題。 –

+0

非常感謝安德烈! – tmanolatos