事务管理
事务管理两种方式: 向下传递,ThreadLocal
向下传递的方式(依赖)
缺点:不利于测试
Service层 获取连接conn(Connection) 转账(conn) 收账(conn) 提交事务 catch(){ 事务回滚 } dao层(通过service层传递过来的Connection对象来保证是同一个连接 ) QueryRunner qr=new QueryRunner(); qr.update(conn,sql,Parameter....);
只要使用同一个连接(Connection对象)就会在一个事务,dao层的类中的方法只能访问一次数据库,如果多次访问数据库,就得把这个业务放在service层进行操作了,使用业务成进行多次调用到层的方法,事务管理主要是使用的Connection对象来管理事务的。
使用线程来实现事务的管理
使用ThreadLocal来管理当前线程
使用jdbcUtils来进行事务的管理
这样dao层获取连接只需要从JDBCUtils中获取连接即可,在业务层开启事务、提交事务、回滚事务。
package com.baidu.utils; import java.sql.Connection; import java.sql.SQLException; import javax.sql.DataSource; import com.mchange.v2.c3p0.ComboPooledDataSource; public class JDBCUtils2 { //从c3p0里面来获取数据源 private static final ComboPooledDataSource dataSource = new ComboPooledDataSource(); //这是当前线程对象 private static final ThreadLocal<Connection> tl = new ThreadLocal<Connection>(); //获取连接 public static Connection getConnection() throws SQLException { Connection conn = null; try { conn = tl.get(); if(conn == null){ //从连接池中获取连接 conn = dataSource.getConnection(); //把获取的连接对象添加到当前线程中去 tl.set(conn); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return conn; } //开启事务 public static void beginTransfer() throws SQLException{ Connection conn = tl.get(); conn.setAutoCommit(false); } //提交事务 public static void commitTransfer() throws SQLException{ Connection conn = tl.get(); conn.commit(); } //回滚事务 public static void rollbackTransfer() throws SQLException{ Connection conn = tl.get(); conn.rollback(); } //获取数据源 public static DataSource getDataSource() { return dataSource; } }