groovy sql 事务
def init = { servletContext ->
Sql.metaClass.withTransaction = { Closure stmt ->
cacheConnection(){
connection.autoCommit = false
try {
stmt().each {
execute(it.query, it.params)
}
connection.commit()
} catch ( e) {
connection.rollback()
throw e
} finally {
connection.autoCommit = true
}
}
}
}
def destroy = {
}
}
Then, you may invoke it in a service:
def sql = new Sql(dataSource)
Connection connection = sql.createConnection();
try{
def sql2 = new Sql(connection);
sql2.withTransaction {
[
[query:"insert into table values (?,?,?)", params:[p1, p2, p3]],
[query:"insert into table2 values (?,?,?)", params:[p4, p5, p6]]
]
}
}finally{
if(sql.dataSource){
connection.close();
}
}
There is already a JIRA requesting this to be added to Groovy:
http://jira.codehaus.org/browse/GROOVY-3158. Vote it if you find this
useful.
public void ttt(){
Sql.metaClass.useTransaction = { Closure closure ->
java.sql.Connection conn = null
try { conn = createConnection();
conn.autoCommit = false;
Sql sql2 = new Sql( conn );
closure(sql2);
conn.commit();
} catch (e) {
if(conn != null)
conn.rollback();
e.printStackTrace();
throw e
} finally {
if ( conn != null ) {
conn.autoCommit = true
if ( dataSource ) { conn.close()
}
}
}
}
}
posted on 2009-12-18 19:53
Libo 阅读(973)
评论(0) 编辑 收藏