在Service中使用ThreadLocal来完成事务,为将来学习Spring事务打基础!
1 DAO中的事务
public void xxx() {
Connection con = null;
try {
con = JdbcUtils.getConnection();
con.setAutoCommitted(false);
QueryRunner qr = new QueryRunner();
String sql = …;
Object[] params = …;
qr.update(con, sql, params);
sql = …;
Object[] params = …;
qr.update(con, sql, params);
con.commit();
} catch(Exception e) {
try {
if(con != null) {con.rollback();}
} catch(Exception e) {}
} finally {
try {
con.close();
} catch(Exception e) {}
}
}
2 Service才是处理事务的地方
我们要清楚一件事,DAO中不是处理事务的地方,因为DAO中的每个方法都是对数据库的一次操作,而Service中的方法才是对应一个业务逻辑。也就是说我们需要在Service中的一方法中调用DAO的多个方法,而这些方法应该在一起事务中。
怎么才能让DAO的多个方法使用相同的Connection呢?方法不能再自己来获得Connection,而是由外界传递进去。
public void daoMethod1(Connection con, …) {
}
public void daoMethod2(Connection con, …) {
}
在Service中调用DAO的多个方法时,传递相同的Connection就可以了。
public class XXXService() {
private XXXDao dao = new XXXDao();
public void serviceMethod() {
Connection con = null;
try {
con = JdbcUtils.getConnection();
con.setAutoCommitted(false);
dao.daoMethod1(con, …);
dao.doaMethod2(con, …);
com.commint();
} catch(Exception e) {
try {
con.rollback();
} catch(Exception e) {}
} finally {
try {
c