步骤
最后的步骤应该为:
try{
1. 开启事务
2. 执行操作
3. 提交事务
}catch(Exception e){
4. 回滚事务
}finally{
5. 释放连接
}
事务控制.
一次转账应该由同一个connection来控制,而不是4个单独的连接. 需要使用ThreadLocal对象吧Connection和当前线程绑定,从而使一个线程中只有一个控制事务的对象.
首先写一个连接的工具类.
1. 新建一个private ThreadLocal< Connection >.
2. 编写getThreadCollection方法从ThreadLocal 中获取连接. conn==null时,从数据源中获取连接.否则直接return conn.
3. 获取了连接后就要编写事务管理的工具类.
4. 还需要一个与连接解绑的方法removeConnection();. 当连接还回连接池后,线程要与连接解绑. 方法就一句话 tl.remove();
事务管理的工具类.
所需的连接 通过Spring的Set方法注入ConnentionUtils. 即可利用getThreadConnection获取连接.
- 开启事务 connectionUtils.getThreadConnection().setAutoCommit(false);
- 提交事务 connectionUtils.getThreadConnection().commit();
- 回滚事务 connectionUtils.getThreadConnection().rollback();
- 释放连接 连接池,只是还回了连接池中. 除了close() 还回连接 还要调用线程连接解绑ConnectionUtils.removeConnection();
现在,Dao里面使用的Runner不再需要用给QueryRunner注入数据源.现在连接从工具类中获得,QueryRunner的参数可以自己提供连接.将数据源注入给连接工具类.
很明显 每个业务都需要上述5个步骤,需要一种方法将重复的地方省略,回归最简单的直接调用操作就好. 这就需要动态代理 , 也就是Spring的AOP