day23(事务管理)

事务管理

    事务管理两种方式: 向下传递,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;
        }    
}

  

原文地址:https://www.cnblogs.com/fjkgrbk/p/transfer_Manager.html